2013-10-18 10 views
8

Sto usando il seguente codice per trovare una stringa in un tipo std::vector di string. Ma come restituire la posizione di un elemento particolare?vector <string> :: iteratore - come trovare la posizione di un elemento

Codice:

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

int main() { 
    vector<string> vec; 
    vector<string>::iterator it; 

    vec.push_back("H"); 
    vec.push_back("i"); 
    vec.push_back("g"); 
    vec.push_back("h"); 
    vec.push_back("l"); 
    vec.push_back("a"); 
    vec.push_back("n"); 
    vec.push_back("d"); 
    vec.push_back("e"); 
    vec.push_back("r"); 

    it=find(vec.begin(),vec.end(),"r"); 
    //it++; 

    if(it!=vec.end()){ 
     cout<<"FOUND AT : "<<*it<<endl; 
    } 
    else{ 
     cout<<"NOT FOUND"<<endl; 
    } 
    return 0; 
} 

uscita:

FOUND AT : r

Output previsto:

FOUND AT : 9

risposta

21

È possibile utilizzare std::distance per questo:

auto pos = std::distance(vec.begin(), it); 

Per un std::vector::iterator, è anche possibile utilizzare l'aritmetica:

auto pos = it - vec.begin(); 
+0

Grazie! appena fuori dalla mia curiosità e se il mio vettore contiene '1000 elementi' e usando' find' sarà più veloce o ho bisogno di usare una sorta di 'puntatore a matrice'? – user2754070

+0

@ user2754070 dovresti misurarlo, ma dubito che sarai più veloce di 'find' in una build ottimizzata. – juanchopanza

3

Uso seguente:

if(it != vec.end()) 
    std::cout<< "Found At :" << (it-vec.begin()) ; 
2
#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

int main() { 
    vector<string> vec; 
    vector<string>::iterator it; 

    vec.push_back("H"); 
    vec.push_back("i"); 
    vec.push_back("g"); 
    vec.push_back("h"); 
    vec.push_back("l"); 
    vec.push_back("a"); 
    vec.push_back("n"); 
    vec.push_back("d"); 
    vec.push_back("e"); 
    vec.push_back("r"); 

    it=find(vec.begin(),vec.end(),"a"); 
    //it++; 
    int pos = distance(vec.begin(), it); 

    if(it!=vec.end()){ 
     cout<<"FOUND "<< *it<<" at position: "<<pos<<endl; 
    } 
    else{ 
     cout<<"NOT FOUND"<<endl; 
    } 
    return 0; 
+1

Alcune spiegazioni sarebbero utili – Anton

0

utilizzare questa istruzione :

it = find(vec.begin(), vec.end(), "r") - vec.begin();