/ / C ++ Poszukaj iteratora std :: string :: na podanej pozycji - c ++, string, iterator, seek

C ++ Szukaj std :: string :: iterator na podanej pozycji - c ++, string, iterator, seek

Czy można szukać std::string::iterator bezpiecznie do danej pozycji?

std :: string :: iterator ma operator dostępu offsetowego (operator []), ale istnieje w kategorii określonej przez niektóre osoby jako niezdefiniowane zachowanie, takie jak it + 3.

referencja cplusplus.com

Odpowiedzi:

2 dla odpowiedzi № 1

std :: string :: iterator ma operator dostępu offsetowego (operator []), ale istnieje w kategorii określonej przez niektóre osoby jako niezdefiniowane zachowanie, np. + 3.

Nie rozumiem tego stwierdzenia. Nie ma takiej kategorii. std::basic_string<>::iterator jest iteratorem o dostępie swobodnym i jako taki możesz szukać, po prostu dodając lub odejmując przesunięcie do / z niego (co jest zgodne z dokumentacją, z którą się łączysz):

auto new_it = it + offset;

Nieokreślone jest poszukiwanie przeszłości end() iterator powiązanego kontenera lub przed jego rozpoczęciem. Oznacza to, że zachowanie jest niezdefiniowane:

std::string str = "hi";
auto it1 = str.begin() + 2; // OK.
assert(it1 == str.end());
auto it2 = str.begin() + 3; // UB!
// At this point we cannot assert anything about it2

1 dla odpowiedzi nr 2

Standardowe iteratory są określone w taki sposóbże nie muszą odnosić się do kontenera (lub innej sekwencji), nad którym iterują; oznacza to, że nie ma możliwości wykonania „bezwzględnego wyszukiwania” za pomocą tylko iteratora. Będziesz potrzebował nowego iteratora z ciągu , sprawdzanie siebie, czy jest w zasięgu; coś jak:

std::string::iterator seek(std::string & s, size_t i) {
return s.length() <= i ? s.end() : s.begin() + i;
}

Arytmetyka w iteratorach o swobodnym dostępie oraz operator[] na ciągach znaków są dobrze zdefiniowane, o ile pozostajesz w zasięgu. Zachowanie jest niezdefiniowane tylko wtedy, gdy wyjdziesz poza zasięg.


1 dla odpowiedzi nr 3

Nie wiem skąd masz taki pomysł operator[] jest UB dla std::string::iterator. Jest zdefiniowany jako iterator o swobodnym dostępie, który obsługuje i[n] jak również i + n.

Na podstawie komentarzy w innych miejscach wydaje się, że jesteśpo pozycjonowaniu bezwzględnym (to nie jest bardzo jasne z treści twojego pytania). Nie możesz tego zrobić z iteratora, którego pozycji nie znasz, ale możesz osiągnąć ten sam efekt poprzez przesunięcie względem iteratora zwrócone przez begin(), tj .: str.begin()[3] lub str.begin() + 3. Jeśli nie masz pod ręką oryginalnego sznurka, jesteś chowany.