Przechowywanie wskaźników w STL

Przechowywanie wskaźników w STL
YA
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 lat
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 ;)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
0

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

YA
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 lat
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

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

pamietaj ze wiele wskaznikow moze pokazywac na to samo miejsce

YA
ale każdy wskaźnik ma swój adres który staje się kluczem
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

YA
usuwając w środku będzie invalidacja, tylko dla operacji na krańcach nie ma
0

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

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Bez wątpienia vector<>


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
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

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Tylko i wyłącznie vector<>


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
satirev
Jeszcze std::array ;)
byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
0

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


edytowany 1x, ostatnio: byku_guzio
YA
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 lat
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).

Azarien
skąd wiesz że porównywane są wskaźniki, skoro jeszcze nie poznaleś tej biblioteki?
YA
wręcz przeciwnie napisałem że pewnie operacje jak porównywanie NIE są wykonywane (bo i po co porównywać wskaźniki). Kontenery asocjacyjne a STL-u sortują dane porównując je a więc nie ma większego sensu wrzucanie wskaźników do nich a jeśli boost jest zorientowany na trzymanie wskaźników to pewnie pomija tą kwestie (choć to moje tylko przemyślenie) sprawdze to bede wiedzial lub możesz sam podpowiedzieć jak są traktowane :)
Azarien
boost::ptr_vector i podobne porównują OBIEKTY, nawet jeśli przechowują wskaźniki. wychodzisz ze złych założeń.
YA
  • Rejestracja:około 18 lat
  • Ostatnio:około 5 lat
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?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 15 godzin
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.

edytowany 1x, ostatnio: Azarien
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)