107

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

4

4 に答える 4

171

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

ベクトルイテレータは、配列ポインタと同じように動作します。ポインタ演算について知っていることのほとんどは、ベクトルイテレータにも適用できます。

std::distanceC ++ 11以降では、イテレーターとポインターの両方に減算の代わりに使用できます。

ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
于 2013-02-26T21:34:53.443 に答える
97

インデックスが必要な場合は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);
}
于 2013-02-26T21:34:42.087 に答える
0

ここでは、ポインタ演算が配列の場合と同じように適用されると確信しています。

int getVecPos(std::vector<string> vec, string element){
    int i;
    for(i = 0; i < vec.size(); i++){
        if(vec[i] == element){
            break;
        }
    }
    if(i == vec.size()){
        std::cout<<"No such element as "<<element<<" found. Please enter again: ";
        std::cin>>element;
        i = getVecPos(vec, element);
    }
        
    return i;
}

これをvec.begin()に追加して、他のベクトル関数に使用できるイテレーターを取得したり、配列内の要素のインデックスを検索するために使用したりできます。例:-

int getVecPos(std::vector<string>, string);//This was the function from earlier.
std::vector<string> UpdateHealables(std::vector<string> healables, string healing_item){
    auto it = healables.begin() + getVecPos(healables, healing_item);
    healables.erase(it);
    return healables;
}
于 2021-11-22T04:27:28.303 に答える
-3

私は初心者なので、ここに初心者の答えがあります。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;
        }
    }
于 2019-05-10T03:22:29.597 に答える