[C++] Rozpoznawanie który element listy po wskaźniku

0

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.

0

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.

0
MarekR22 napisał(a)

distance

O to mi chodziło [!!!] [browar]

0

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!

0

vector synu, vector :>

0
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ź :-)

0

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.

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