Mam takie głupie pytanie. Mam wskaźnik na dany element esteelowskiej listy, jak sprawdzić który to jest element licząc od początku listy ? Nie chodzi mi tu o brutowskie przechodzenie od początku do elementu i liczenie. Przeszukiwałem wcześniej dokumentację stl ale nie znalazłem.
to poczytaj o tym, jak wygląda lista, nieważne czy ta z STL z twoja własna, czy kumpla zza ściany. ŻADNA lista nie oferuje swobodnego dostępu, a do tego się sprowadza twój problem. Pomyśl o innej strukturze danych.
MarekR22 napisał(a)
O to mi chodziło [!!!] [browar]
Marku, bardzo fajnie, tylko że:
cppreference.com napisał(a)
If i is a Random Access Iterator, the function uses operator- to calculate this. Otherwise, the function uses repeatedly the increase or decrease operator (operator++ or operator--) until this distance is calculated.
czyli ładnie to wywołanie może w kodzie wygląda, ale mamy tu do czynienia właśnie z "brutowskim przechodzeniem od początku do elementu i liczeniem". Warto to zaznaczyć, żeby sidknota nie wprowadzać w błąd: pod względem efektywności jest to bardzo złe rozwiązanie. Jeśli ma się na tym opierać jakiś bardziej wyrafinowany algorytm to d..pa blada - trzeba szukać innej struktury!
vector synu, vector :>
Ranides napisał(a)
Marku, bardzo fajnie, tylko że:
cppreference.com napisał(a)
If i is a Random Access Iterator, the function uses operator- to calculate this. Otherwise, the function uses repeatedly the increase or decrease operator (operator++ or operator--) until this distance is calculated.
czyli ładnie to wywołanie może w kodzie wygląda, ale mamy tu do czynienia właśnie z "brutowskim przechodzeniem od początku do elementu i liczeniem". Warto to zaznaczyć, żeby sidknota nie wprowadzać w błąd: pod względem efektywności jest to bardzo złe rozwiązanie. Jeśli ma się na tym opierać jakiś bardziej wyrafinowany algorytm to d..pa blada - trzeba szukać innej struktury!
Masz rację, nie doczytałem do końca
crayze napisał(a)
vector synu, vector :>
Potrzebuję także szybkiego usuwania, dlatego vector odpada. Spróbuję to jakoś obejść, dzięki za każdą odpowiedź :-)
Jeżeli kolejność elementów nie jest ważna to po prostu zastępuj usuwany element ostatnim + pop_back. Koszt takiej operacji powinien być akceptowalny - jeszcze nie spotkałem się z przypadkiem, w którym wewnętrznie wywoływany delete dla usuwanego elementu listy był zauważalnie szybszy od kopiowania obiektu (chyba, że stosujesz własne szybkie alokatory). Możesz od razu zrobić własną klasę dziedziczącą z wektora z tak zaimplementowanym usuwaniem.
Co do znalezienia elementu po wskaźniku - wskaźnik to możesz mieć na (za)wartość elementu, na sam element wskazuje iterator. Dystans iteratorów opisał ładnie ranides, liczenie dystansu wskaźnika i iteratora nie ma w ogóle gwarancji powodzenia.
Ew. możesz zainteresować się modyfikacją kontenera (d)queue.