Przechowywanie wskaźników w STL

0

Witam,

Małe wariacje na temat trzymania wskaźników w STL - jaki kontener nadaje się najlepiej do tego typu operacji biorąc pod uwagę szybkość działania na dużej ilości danych.

Jeśli mamy klucze i wskaźniki bez wątpienia dobra jest map-a trzymająca pary klucz/wartość. Szybka i łatwość dostępu do elementów na plus.

A dla samych wskaźników? list-a (każdy element w odrębnym bloku pamięci więc iteratory nie tracą wartości, stały czas wstawiania elementów) czy np zbiór set (klucze są wartościami)? set należy do kontenerów asocjacyjnych, posortowanych i w zasadzie nie ma większego sensu trzymać wskaźników w nim (sortowane są wskaźniki) więc chyba lista jest lepsza i szybsza?

A Wy jakich kontenerów używacie?

Pozdrawiam ;)

0

set to kontener na unikalne obiekty i używa się go kiedy nie chcesz sie zastanawiać "czy mam już w tej kolekcji X?" tylko wrzucasz i się nie przejmujesz
kwestia lista czy vector rozbija sie o to co chcesz robić. vector ma dostęp swobodny w czasie stałym, lista nie.

0

vector, mapa albo deque, zależy od logiki modułu

1

więc do przechowywania wskaźników poniekąd byłby dobry set (każdy wskaźnik ma inny adres który jest użyty jako klucz). Dostęp szybki i każdy element trzymany osobno w pamięci - dobrze pamiętam?

Vector ma dostęp swobodny ale realokując vector przy rozszerzaniu tracimy ważność iteratorów, referencji itd nasze wskaźniki są kopiowane w nowe miejsce w pamięci. Dodawanie i usuwanie do/z vectora jest optymalne tylko na końcu, w środku jest już mało efektywne, elementy muszą być przesunięte, iteratory tracą ważnośc itd.

Lista ma stały czas wstawiania/usuwania, elementy trzymane osobno w pamięci, brak dostępu przez indeks tylko iterowanie czyli czym więcej tym dłużej

w deque przy wstawianiu/usuwaniu także tracimy ważnośc iteratorów

0

pamietaj ze wiele wskaznikow moze pokazywac na to samo miejsce

0
yabolik napisał(a):

w deque przy wstawianiu/usuwaniu także tracimy ważnośc iteratorów

jak wybierasz std::deque to nie będzie invalidacji bo pracujesz na pierwszym lub ostatnim elemencie zawsze

http://en.cppreference.com/w/cpp/container/deque/insert
http://en.cppreference.com/w/cpp/container/deque/erase

0

Który kontener jest najszybszy jeśli chodzi o samo iterowanie od początku do końca?

0

Bez wątpienia vector<>

0
_13th_Dragon napisał(a):

Bez wątpienia vector<>

A który jeszcze kontener udostępnia możliwość zarezerwowania miejsca by elementy były w jednym bloku pamięci? W Deque nie znalazłem a szkoda że nie ma hehe

0

Tylko i wyłącznie vector<>

0

Jest jeszcze unordered_set i unordered_map. Ciężko powiedzieć co będzie najsensowniejsze skoro nie wiadomo co chcesz osiągnąć.

1

Jak widzę do trzymania wskaźników przystosowana jest biblioteka boost która ma dedykowane ku temu kontenery np.: ptr_vector, ptr_list, ptr_deque, ptr_map, ptr_set itd i zapewnia również usuwanie elementów czego nie robi stl (programista musi sam usuwać). Więc zamiast pisać własny szablon w oparciu o STL zapewniający kasowanie obiektów dużo lepiej użyć boosta :D

Zdecydowanie czas na poznanie tej bibliteki ale skoro ma zmienioną implementację zorientowaną na trzymanie wskaźników to pewnie dostęp do elementów, iterowanie, wstawianie, usuwanie itd odbywa się w nieco inny sposób niż w STL-u pomijając pewnie operacje jak porównywanie które w kontenerach asocjacyjnych sensu większego nie mają (bo porównywane są wskaźniki).

0

A jeszcze jedno ciekawe pytanie - czy ktoś używa boost-a w Borlandzie? I chodzi mi o starą wersję 6.0. Z tego co widzę to nowe wersje XE mają zaimplementowanego boosta który ... nie działa i z tego co pogooglowałem to są problemy w nowych wersjach XE to pewnie w 6.0 (z której niestety muszę korzystać) to w ogóle mogę pomarzyć o korzystaniu z tej biblioteki hehe

http://programowanie.cal.pl/forum/viewtopic.php?f=5&t=997

Czy ktoś korzystał z boosta w Borlandzie 6.0?

1

to w ogóle mogę pomarzyć o korzystaniu z tej biblioteki hehe
Boost to jest taka trochę schizofrenia: z jednej strony, niektóre biblioteki z pakietu Boost korzystają z najnowszych zdobyczy C++11 i wymagają nowego kompilatora spełniajacego wszystkie standardy,
a z drugiej strony inne stanowią jakby patch na stare kompilatory, uzupełniający braki w bibliotece standardowej.

Im starszy masz kompilator, tym bardziej Boost służy do tego drugiego a mniej do pierwszego ;-)

Nie wiem jak z Boostem pod BC++ 6, ale zbyt wielkiego supportu bym nie oczekiwał. Wszystko zależy od tego, czego potrzebujesz z Boosta, bo to nie jest jedna biblioteka, a wymagania poszczególnych bibliotek różnią się bardzo.

0
yabolik napisał(a):

Jak widzę do trzymania wskaźników przystosowana jest biblioteka boost która ma dedykowane ku temu kontenery np.: ptr_vector, ptr_list, ptr_deque, ptr_map, ptr_set itd i zapewnia również usuwanie elementów czego nie robi stl (programista musi sam usuwać). Więc zamiast pisać własny szablon w oparciu o STL zapewniający kasowanie obiektów dużo lepiej użyć boosta :D

Po temacie wnioskuję, że szukasz kontenera, który trzyma wskaźniki do obiektów. W takim razie możesz spokojnie użyć std::/boost::shared_ptr. Jeśli potrzebujesz trzymać w kontenerze wskaźniki na tablice to skorzystaj z std::shared_ptr<T[]>/boost::shared_array.

1 użytkowników online, w tym zalogowanych: 0, gości: 1