Próbuję uzyskać indeks elementu w wektorze strings
, aby użyć go jako indeksu w innym wektorze int
typu, czy jest to możliwe?
Przykład:
vector <string> Names;
vector <int> Numbers;
...
// condition to check whether the name exists or not
if((find(Names.begin(), Names.end(), old_name_)) != Names.end())
{ // if yes
cout <<"Enter the new name."<< endl;
cin >> name;
replace(Names.begin(), Names.end(), old_name_, name);
}
Teraz chcę uzyskać położenie old_name
w Names
wektorze, aby użyć go w dostępie do określonego elementu w Numbers
wektorze. Więc mogę powiedzieć:
Numbers[position] = 3 ; // or whatever value assigned here.
Próbowałem użyć:
vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;
ale oczywiście to nie działa, ponieważ pos
jest typu string!
Odpowiedzi:
Aby uzyskać pozycję elementu w wektorze, znając iterator wskazujący na element, po prostu odejmij
v.begin()
od iteratora:Teraz trzeba sprawdzić
pos
przedNames.size()
sprawdzić, czy to jest poza zakresem lub nie:Iteratory wektorów zachowują się podobnie do wskaźników tablicowych; większość tego, co wiesz o arytmetyce wskaźników, można zastosować również do iteratorów wektorów.
Począwszy od C ++ 11, możesz używać
std::distance
zamiast odejmowania zarówno dla iteratorów, jak i wskaźników:źródło
ptrdiff_t
lepiej niżsize_t
odkądptrdiff_t
podniosłoby ostrzeżenie o porównaniu między liczbą całkowitą zeptrdiff_t
ponieważ umożliwia przechowywanie odległości między dowolnymi parami iteratorów w tym samym pojemniku, nawet w sytuacjach, gdy wynik jest ujemny. Jeśli używamysize_t
, musimy uważać, aby nie odjąć większego iteratora od mniejszego iteratora.Jeśli chcesz mieć indeks, możesz użyć go
std::find
w połączeniu zstd::distance
.źródło
Jestem początkującym, więc oto odpowiedź dla początkujących. Jeśli w pętli for daje i, które może być następnie użyte, jakkolwiek potrzebne, takie jak Numbers [i] w innym wektorze. Większość jest puszystą na przykład, for / if naprawdę mówi wszystko.
źródło