文字列ベクトルの特定の要素の位置を取得し、それを整数ベクトルのインデックスとして使用するにはどうすればよいですか?


99

のベクトルの要素のインデックスを取得しようとしています。これstringsintタイプの別のベクトルのインデックスとして使用しますが、これは可能ですか?

例:

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_nameNamesベクター内の特定の要素へのアクセスに使用するために、ベクター内のの位置を取得します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文字列型なので、明らかにこれは機能しません!



std :: mapまたはstd :: unordered_mapをチェックアウトする必要があります。
Etherealone 2013

回答:


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

@Bob__のコメントが表示されません。削除された可能性がありますか?私は、なぜ思ったんだけどptrdiff_tよりも優れているsize_tので、ptrdiff_t 符号付きおよび符号なし整数間の比較の警告を引き上げる

3
@ヒラク彼はコメントを削除しました。ptrdiff_t結果が負の場合でも、イテレータの任意のペア間の距離を同じコンテナに格納できるため、彼は使用を提案しました。使用する場合はsize_t、小さい反復子から大きい反復子を減算しないように注意する必要があります。
dasblinkenlight 2017年

より正確には、 "#include <algorithm>"を追加する必要があります(std :: findを使用する場合)。質問の作者もこの "include"を省略しました。
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
なぜconst-iteratorsを使わないのですか?
ダニ2016

-1

私は初心者なので、初心者向けの回答です。forループのifはiを提供しますが、これは使用できますが、別のベクトルのNumbers [i]などが必要です。ほとんどは例のために綿毛です、for / ifは本当にそれをすべて言います。

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.