কীভাবে স্ট্রিং ভেক্টরে কোনও নির্দিষ্ট উপাদানের অবস্থান পাওয়া যায়, এটি কীট ভেক্টরে সূচক হিসাবে ব্যবহার করতে?


102

আমি কোনও ভেক্টরের কোনও উপাদানের সূচক পেতে চেষ্টা করছিলাম 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টাইপ স্ট্রিংয়ের কারণে!



আপনার স্ট্যান্ড :: ম্যাপ বা স্টাডি :: আনর্ডার্ড_ম্যাপটি পরীক্ষা করা উচিত।
ইথেরিয়লোনে

উত্তর:


161

কোনও ভেক্টরে কোনও উপাদানটির অবস্থান পাওয়ার জন্য কোনও এলিটরকে উপাদানটির দিকে নির্দেশ করে জেনে, কেবল 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
}

ভেক্টর পুনরাবৃত্তকারী অ্যারে পয়েন্টারগুলির অনুরূপ আচরণ করে; আপনি পয়েন্টার গাণিতিক সম্পর্কে যা জানেন তা বেশিরভাগ ভেক্টর পুনরাবৃত্তির ক্ষেত্রেও প্রয়োগ করা যেতে পারে।

সি ++ 11 দিয়ে শুরু করে আপনি std::distanceপুনরাবৃত্তকারী এবং পয়েন্টার উভয়ের জন্য বিয়োগের জায়গায় ব্যবহার করতে পারেন :

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

দুঃখিত, আমি @ Bob__ এর মন্তব্য দেখতে পাচ্ছি না, সম্ভবত মুছে ফেলা হয়েছে? আমি ভাবছি যেহেতু তার ptrdiff_tচেয়ে ভাল কেন স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যার মধ্যে তুলনার সতর্কতা উত্থাপন করবেsize_tptrdiff_t
হিরাকু

4
@ হিরাকু তিনি তার মন্তব্য মুছে দিয়েছেন। তিনি ব্যবহারের পরামর্শ দিয়েছিলেন ptrdiff_tকারণ ফলাফলটি negativeণাত্মক হওয়ার পরেও এমন পরিস্থিতিতে আপনি যে কোনও পুনরুক্তিকারীদের মধ্যে একই পাত্রে প্রবেশ করতে পারেন lets আমরা যদি ব্যবহার size_tকরি তবে আমাদের অবশ্যই যত্নবান হতে হবে যে কোনও ছোট পুনরুক্তিকারক থেকে কোনও বৃহত্তর পুনরাবৃত্তিটি বিয়োগ না করে।
সের্গেই কালিনিচেনকো

4
আরও সুনির্দিষ্ট হওয়ার জন্য, আপনার "# অন্তর্ভুক্ত <algorithm>" যোগ করা উচিত (স্ট্যান্ডার্ড :: ব্যবহারের জন্য)। প্রশ্নের লেখক এটিকেও "অন্তর্ভুক্ত" বাদ দিয়েছেন।
গ্রেগ2015

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
কনস্ট্যান্ট-এটারেটর ব্যবহার করবেন না কেন?
দানি

0

কেউ সাধারণ সংস্করণটিকে কারও কারও জন্য কার্যকারণ হিসাবে উল্লেখ করেনি std::vector<T>তাই এটি এখানে (এক কুরুচিপূর্ণ লাইনে):

#include <algorithm>

template <typename T> long long int indexOf(const std::vector<T> &vector , const T &data){

   return (std::find(vector.begin(), vector.end(), data) != vector.end()) //Is it in the vector ?
           ?
           std::distance(vector.begin(), std::find(vector.begin(), vector.end(), data)) //Yes, take the distance (C++11 and above, see the previous answers)
           : -1; //No, return -1
}

এবং টার্নারি অপারেটর ছাড়াই:

#include <algorithm>

template <typename T> long long int indexOf(const std::vector<T> &vector , const T &data){

     if((std::find(vector.begin(), vector.end(), data) != vector.end())){
         return std::distance(vector.begin(), std::find(vector.begin(), vector.end(), data));
     }
     else{return -1;}
}

উপাদানটি ভেক্টরে না থাকলে এটি সূচক বা -1 প্রদান করে।


নোট করুন যে এটি বড় ভেক্টরগুলির জন্য খুব ধীর হতে পারে , কারণ এটি দুটি বার গণনা করে std::find


-2

আমি একটি শিক্ষানবিস তাই এখানে একটি উত্তর দেওয়া উত্তর। লুপের জন্য যদি আই দেয় তবে যা অন্য ভেক্টরে নাম্বার [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;
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.