/ / Szukanie ciągu w dwóch iteratorach w C ++ - c ++, iterator

Poszukuję ciągów w dwóch iteratorach w C ++ - c ++, iterator

W C ++ wiem, że możesz mieć wieleiteratory. Na przykład, jeśli masz funkcję, która chciała zobaczyć pierwszą zbieżność ciągu w dwóch iteratorach, dlaczego kod wyglądałby mniej więcej tak:

Iterator found_it(Iterator one, Iterator two){
while(one != two && (*one) != "Bob"){
one++;
}
return one;
}

* Pytanie brzmiało: jeden i dwa niekoniecznie oznaczają początek () i koniec () - to naprawdę dało mi umysł **** i zamieszanie: S *

Po pierwsze, co się stanie, jeśli Bob był w iteratorze two? Ponieważ zwracasz tylko iterator one? Właśnie to mnie w tej chwili dezorientuje.

Dzięki

Odpowiedzi:

1 dla odpowiedzi № 1

Gdy dwa iteratory używane jako zakres dla funkcji lub standardowy algorytm, drugi iterator nie jest objęty zakresem. To znaczy powinieneś wziąć pod uwagę zakres

[first, last )

Jeśli jakaś funkcja lub algorytm std::find zwraca drugi iterator, to znaczy, że zakres nie zawiera wartości docelowej.

Jeśli drugi iterator był zawarty w zakresie, powstaje pytanie, który iterator zwrócić, gdy wartość docelowa nie zostanie znaleziona?

Rozważmy na przykład własną funkcję z następującymi wywołaniami

template <class Iterator>
Iterator found_it(Iterator one, Iterator two){
while(one != two && (*one) != "Bob"){
one++;
}
return one;
}

//...

std::vector<std::string> v1 = { "Mary", "Bob" };
std::vector<std::string> v2 = { "Mary", "Peter" };

auto it1 = found_it( v1.begin(), v1.end() );

if ( it1 != v1.end() ) std::cout << *it1 << " is present in v1" << std::endl;
else std::cout << "Bob" << " is not present in v1" << std::endl;

auto it2 = found_it( v2.begin(), v2.end() );

if ( it2 != v2.end() ) std::cout << *it2 << " is present in v2" << std::endl;
else std::cout << "Bob" << " is not present in v2" << std::endl;

0 dla odpowiedzi nr 2

one i two są początkiem i końcem (naprawdę tuż poza końcem) zakresu, który chcesz wyszukać. To może nie być taki sam jak begin() i end() na kontenerze, jeśli chcesz wyszukać tylko podzakres lub jeśli iteratory w ogóle nie pochodzą z kontenera.

Zauważ, że one zmienia się w pętli; niekoniecznie zwracasz oryginalną wartość one.

Twoja funkcja może zostać przepisana w następujący sposób:

Iterator found_it(Iterator begin, Iterator end) {
Iterator current = begin;
while (current != end && (*current) != "Bob"){
current++;
}
return current;
}

0 dla odpowiedzi № 3

Jeśli „Bob” znajduje się na drugim iteratorze, oznacza to, że znajduje się poza zakresem, który chcesz wyszukać, więc nie można go znaleźć. Drugi iterator to jedna przeszłość zakres wyszukiwania.

Więc wyszukujesz z one do, ale nie wliczając, two.

Kiedy chcesz wyszukać cały pojemnik wtedy przejdziesz begin() i end() jako argumenty one i two. Ale iteratory zapewniają elastyczność wyszukiwania pośrednich zakresów w ciągu pojemnik.

Na przykład co jeśli chcesz znaleźć wszystkie boby?

std::vector<std::string> names {"Tim", "Beryl", "Bob", "Danny", "Bob", "Lou"};

Możesz uzyskać pierwszy taki:

auto bob1 = fond_it(names.begin(), names.end());

Możesz uzyskać drugi taki:

auto bob2 = fond_it(bob1 + 1, names.end());

Zauważ, że możesz rozpocząć wyszukiwanie w połowie za pomocą bob1 raczej niż na początku.