स्ट्रिंग्स वेक्टर में एक निश्चित तत्व की स्थिति कैसे प्राप्त करें, इसे एक इंडेक्स इन्ट्स वेक्टर के रूप में उपयोग करें?


99

मैं वेक्टर के एक तत्व के सूचकांक को प्राप्त करने की कोशिश कर रहा हूं 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);
    }

अब मैं वेक्टर old_nameमें स्थिति प्राप्त करना चाहता हूं Names, इसका उपयोग 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टाइप स्ट्रिंग है!


मुझे लगता है कि यह चाहिए stackoverflow.com/questions/1425349/…
फ्रांसेस्को वोलेरो

आपको std :: map या std :: unordered_map की जांच करनी चाहिए।
Etherealone

जवाबों:


158

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

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

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

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

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

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

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

क्षमा करें, मैं @bus__ की टिप्पणियां नहीं देख सकता, शायद हटा दी गई है? मैं सोच रहा था कि क्यों ptrdiff_tबेहतर है size_tक्योंकि ptrdiff_t हस्ताक्षरित और अहस्ताक्षरित पूर्णांक के बीच तुलना की चेतावनी को उठाया जाएगा
हिराकु

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

अधिक सटीक होने के लिए, आपको "#include <कलन विधि>" जोड़ना चाहिए (std :: find का उपयोग करने के लिए)। प्रश्न के लेखक ने इसे "शामिल" भी छोड़ दिया।
Grag2015

92

यदि आप एक सूचकांक चाहते हैं, तो आप के std::findसाथ संयोजन में उपयोग कर सकते हैं 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);
}

8
कांस्टीट्यूशन का उपयोग क्यों नहीं करते?
दानी

-1

मैं एक शुरुआती हूं इसलिए यहां एक शुरुआती जवाब है। अगर लूप के लिए अगर मैं देता हूं, जो तब इस्तेमाल किया जा सकता है, लेकिन जरूरत के रूप में जैसे कि एक और वेक्टर में नंबर [i]। अधिकांश उदाहरणों के लिए फुलाना है, के लिए / यदि वास्तव में यह सब कहता है।

int main(){
vector<string>names{"Sara", "Harold", "Frank", "Taylor", "Sasha", "Seymore"};
string req_name;
cout<<"Enter search name: "<<'\n';
cin>>req_name;
    for(int i=0; i<=names.size()-1; ++i) {
        if(names[i]==req_name){
            cout<<"The index number for "<<req_name<<" is "<<i<<'\n';
            return 0;
        }
        else if(names[i]!=req_name && i==names.size()-1) {
            cout<<"That name is not an element in this vector"<<'\n';
        } else {
            continue;
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.