std::vector Index eines Elements erhalten
-
Ich bin auf der Suche nach einer Möglichkeit den Index (als
short
oderint
) eines Elements eines Vectors zu erhalten.mein Versuch bisher:
vector<string> vec; vector<string>::iterator it; //vec wird gefüllt string str = "bla"; //Suchstring int index = 0; //Index it = find(vec.begin(), vec.end(), str); if(it != vec.end()) index = it; //geht ja nicht
Wie geht das?
-
it-vec.begin()
-
Oder mit std::distance (http://en.cppreference.com/w/cpp/iterator/distance):
auto index( std::distance( vec.begin(), it ) );
Im Fall deines vectors läuft das intern auf den operator- (siehe Volkard) hinaus. Der Vorteil ist, dass es aber auch bei Containern mit anderen Iteratoren (zb std::list) funktioniert.
-
Da will ich aber auch, daß es nicht funktioniert.
-
Hallo, bin selbst Anfänger, habe eben mal kurz gegoogled und Folgendes gefunden, kompiliert und ausgegeben - funktioniert offenbar:
#include <iostream> #include <algorithm> #include <vector> int main() { int elem = 20; int lookup[] = { 2,4,6,8,9,10,20,30,40,1,3,5,7 }; std::vector<int> myvec(lookup, lookup + sizeof(lookup) / sizeof(lookup[0]) ); int pos = std::find(myvec.begin(), myvec.end(), elem) - myvec.begin(); if( pos < myvec.size() ) std::cout << elem << " is at position " << pos << '\n'; else std::cout << elem << " not found.\n"; }
Keine Ahnung, ob die Vorgehensweise effizient ist, aber es scheint zu funktionieren, weil es Folgendes ausgibt:
20 is at position 6
-
@volkard: Hehe, ok.
c+dummie: Das ist doch genau das, was Volkard gesagt hat.
-
Jo, geht!
Danke
-
obwohl Du bzw. Volkard das sich besser beurteilen kann als ich. Das Schöne an dem Schnipsel von Vorhin ist vielleicht und zusätzlich, dass Erinnnerung jetzt ein lauffähiges Progrämmchen da stehen hat - das spart vielleicht etwas Arbeit....