2011-05-26 21 views
9
int i; 
vector<string> names; 
string s = "penny"; 
names.push_back(s); 
i = find(names.begin(), names.end(), s); 
cout << i; 

मैं वेक्टर में किसी तत्व की अनुक्रमणिका ढूंढने का प्रयास कर रहा हूं। यह iterators के साथ ठीक है, लेकिन मैं इसे int के रूप में चाहता हूं। मैं यह कैसे कर सकता हूं?इटरेटर को int

उत्तर

24

आप इसके लिए std::distance का उपयोग कर सकते हैं।

i = std::distance(names.begin(), std::find(names.begin(), names.end(), s)); 

आप शायद देखना होगा कि आपकी सूचकांक सीमा से बाहर नहीं है, हालांकि चाहते हैं।

if(i == names.size()) 
    // index out of bounds! 

यह शायद स्पष्ट std :: दूरी उपयोग करने से पहले इटरेटर के साथ ऐसा करना है, हालांकि है।

std::vector<std::string>::iterator it = std::find(names.begin(), names.end(), s); 

if(it == names.end()) 
    // not found - abort! 

// otherwise... 
i = std::distance(names.begin(), it); 
1

कोशिश

i = (find(names.begin(), names.end(), s) - names.begin()); 

संपादित करें: यद्यपि आप बजाय वेक्टर :: size_type का उपयोग कर एक पूर्णांक के विचार करना चाहिए।

+0

भिन्नता आप कर सकते हैं यह संकलक त्रुटि देता है के बाद से मैं पूर्णांक और नहीं इटरेटर है। – thetux4

+1

@ thetux4: ऐसा नहीं करना चाहिए। जब आप दो पुनरावृत्तियों को घटाते हैं तो आपको एक अंतर प्रकार प्राप्त करना चाहिए जो 'std :: vector :: iterator' एक पूर्णांक प्रकार है। –

+0

हां मुझे पता है;) यही कारण है कि आपको अपनी बजाय अपनी लाइन का उपयोग करना चाहिए। ढूंढें() एक पुनरावर्तक देता है और नामों को कम करता है .begin() उस इटरेटर से वेक्टर :: size_type yoields। (एक हस्ताक्षरित पूर्णांक प्रकार - शायद लंबे समय तक अनगिनत कुछ की तरह) – iolo

5
std::vector<string>::iterator it = std::find(names.begin(), names.end(), s); 
if (it != names.end()) { 
    std::cout << std::distance(names.begin(), it); 
} else { 
    // ... not found 
} 
1

अनुमान है कि मैं अपने कोड के बारे में बनाने हूँ:

using std::vector; 
using std::cout; 
using std::string; 

मेरी पूर्वानुमान सही हैं, तो आप vector की शुरुआत और iterator (अनिवार्य रूप में सूचकांक के बीच distancefind कर सकते हैं vector, जिस पर आप इस तरह के तत्व प्राप्त कर सकते हैं):

using std::distance; 
तो जैसा

...

vector<string>::iterator i = find(names.begin(), names.end(), s); 
if (i != names.end()) 
{ 
    cout << "Index " << std::distance(names.begin(), i); 
} 
else 
{ 
    cout << s << "not found"; 
} 
0

सिर्फ अपने इटरेटर

int i = *name; 
संबंधित मुद्दे