2013-02-26 30 views
64

मैं strings के वेक्टर में किसी तत्व की अनुक्रमणिका प्राप्त करने का प्रयास कर रहा हूं, इसे int प्रकार के किसी अन्य वेक्टर में इंडेक्स के रूप में उपयोग करने के लिए, क्या यह संभव है?स्ट्रिंग वेक्टर में किसी निश्चित तत्व की स्थिति कैसे प्राप्त करें, इसे इन्ट्स वेक्टर में इंडेक्स के रूप में उपयोग करने के लिए?

उदाहरण:

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

अब मैं Names वेक्टर में old_name की स्थिति प्राप्त करने के लिए, Numbers वेक्टर में कुछ तत्व तक पहुँचने में उपयोग करना चाहते हैं। ताकि मैं कह सकता हूँ:

Numbers[position] = 3 ; // or whatever value assigned here. 

मैंने कोशिश का उपयोग कर:

vector <string> :: const_iterator pos; 
pos = (find(Names.begin(), Names.end(), old_name_)) 
Numbers[pos] = 3; 

लेकिन स्पष्ट रूप से यह काम नहीं करता क्योंकि pos प्रकार स्ट्रिंग की है!

+0

मुझे लगता है कि यह होना चाहिए http://stackoverflow.com/questions/1425349/how-do- i-find-an-element-position-in-stdvector –

+0

आपको std :: map या std :: unordered_map को देखना चाहिए। – Etherealone

उत्तर

118

पुनरावर्तक तत्व की ओर इशारा करते जानते हुए भी एक सदिश में एक तत्व की स्थिति के लिए, बस पुनरावर्तक से v.begin() घटाना:

ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin(); 

अब आप यह देखने के लिए Names.size() के खिलाफ pos जांच करने की आवश्यकता यह सीमा से है या नहीं बाहर है:

if(pos >= Names.size()) { 
    //old_name_ not found 
} 

वेक्टर iterators सरणी संकेत के समान तरीके से व्यवहार; पॉइंटर अंकगणितीय के बारे में जो कुछ आप जानते हैं उसे वेक्टर इटरेटर्स पर भी लागू किया जा सकता है।

सी ++ 11 के साथ शुरू तुम दोनों iterators और संकेत के लिए घटाव के स्थान पर std::distance उपयोग कर सकते हैं:

ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_)); 
+0

क्षमा करें, मैं @Bob__ की टिप्पणियां नहीं देख सकता, शायद हटा दिया गया? मैं सोच रहा हूं कि 'ptrdiff_t'' size_t' से बेहतर क्यों है क्योंकि 'ptrdiff_t' हस्ताक्षरित और हस्ताक्षरित पूर्णांक – Hiraku

+1

@ हिराकु के बीच तुलना की चेतावनी उठाएगा, उन्होंने अपनी टिप्पणी हटा दी है। उन्होंने 'ptrdiff_t' का उपयोग करने का सुझाव दिया क्योंकि यह आपको किसी भी कंटेनर में एक ही कंटेनर में दूरी को स्टोर करने देता है, यहां तक ​​कि जब परिणाम नकारात्मक होता है। यदि हम 'size_t' का उपयोग करते हैं तो हमें सावधान रहना चाहिए कि एक बड़े इटरेटर को छोटे इटरेटर से घटाएं। – dasblinkenlight

69

यदि आप एक इंडेक्स चाहते हैं, तो आप std::distance के साथ संयोजन में उपयोग कर सकते हैं।

auto it = std::find(Names.begin(), Names.end(), old_name_); 
if (it == Names.end()) 
{ 
    // name not in vector 
} else 
{ 
    auto index = std::distance(Names.begin(), it); 
} 
+3

क्यों कॉन्स्ट-इटरेटर्स का उपयोग नहीं करते? – dani

संबंधित मुद्दे