1. ホーム
  2. c++

[解決済み] 文字列ベクトル中のある要素の位置を取得し、intsベクトルのインデックスとして使用するには?

2022-10-15 16:24:48

質問

のベクトル中の要素のインデックスを取得しようとしています。 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 は文字列型だからです!

どのように解決するのですか?

ある要素を指すイテレータを知っていて、その要素のベクトル内の位置を得るには、単純に 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_));