2013-10-18 27 views
8

std::vector türünde string türünde bir dize bulmak için aşağıdaki kodu kullanıyorum. Ama belirli elemanın pozisyonunu nasıl iade edebilirim?vector <string> :: yineleyici - bir öğenin konumunun nasıl bulunacağı

Kodu:

#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; 
} 

Çıktı:

FOUND AT : r

Beklenen Çıktı:

FOUND AT : 9

cevap

21

Bunun için std::distance kullanabilirsiniz: Aşağıdaki

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

Teşekkürler! benim merakımdan ne çıktıysa, eğer benim vektörüm '1000 elementi' içeriyorsa ve 'find'i kullanmak daha hızlı mı olacak yoksa 'array'e bir çeşit pointer' kullanmalı mıyım? – user2754070

+0

@ user2754070 ölçmek zorunda kalacaksınız, ancak optimize edilmiş bir yapıda "bul" dan daha hızlı olacağından şüpheliyim. – juanchopanza

3

Kullanımı:

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

Bazı açıklamalar yardımcı olabilir – Anton

0

kullanın bu açıklama

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

bir std::vector::iterator için ayrıca aritmetik kullanabilirsiniz :

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