Bagaimana cara mendapatkan posisi elemen tertentu dalam vektor string, menggunakannya sebagai indeks dalam vektor ints?


99

Saya mencoba untuk mendapatkan indeks elemen dalam vektor strings, untuk menggunakannya sebagai indeks dalam intjenis vektor lain , apakah ini mungkin?

Contoh:

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

Sekarang saya ingin mendapatkan posisi old_namedalam Namesvektor, untuk menggunakannya dalam mengakses elemen tertentu dalam Numbersvektor. Sehingga saya bisa mengatakan:

Numbers[position] = 3 ; // or whatever value assigned here.

Saya mencoba menggunakan:

vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;

tapi jelas ini tidak bekerja karena posbertipe string!



Anda harus memeriksa std :: map atau std :: unordered_map.
Etherealone

Jawaban:


158

Untuk mendapatkan posisi elemen dalam vektor yang mengetahui iterator yang menunjuk ke elemen, cukup kurangi v.begin()dari iterator:

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

Sekarang Anda perlu memeriksa posterhadap Names.size()untuk melihat apakah itu di luar batas atau tidak:

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

iterator vektor berperilaku mirip dengan pointer array; sebagian besar dari apa yang Anda ketahui tentang aritmatika pointer dapat diterapkan ke iterator vektor juga.

Dimulai dengan C ++ 11 Anda dapat menggunakan std::distancesebagai pengganti pengurangan untuk iterator dan pointer:

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

Maaf, saya tidak bisa melihat komentar @Bob__, mungkin dihapus? Saya bertanya-tanya mengapa ptrdiff_tlebih baik daripada size_tsejak ptrdiff_t akan meningkatkan peringatan perbandingan antara integer bertanda tangan dan tidak bertanda tangan
Hiraku

3
@Hiraku Dia menghapus komentarnya. Dia menyarankan penggunaan ptrdiff_tkarena memungkinkan Anda menyimpan jarak antara sepasang iterator ke dalam wadah yang sama, bahkan dalam situasi ketika hasilnya negatif. Jika kita menggunakan size_tkita harus berhati-hati untuk tidak mengurangi iterator yang lebih besar dari iterator yang lebih kecil.
dasblinkenlight

Untuk lebih tepatnya, Anda harus menambahkan "#include <algorithm>" (untuk menggunakan std :: find). Penulis pertanyaan menghilangkan "sertakan" ini juga.
Grag2015

92

Jika Anda menginginkan indeks, Anda dapat menggunakan std::findkombinasi dengan 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
mengapa tidak menggunakan const-iterators?
dani

-1

Saya seorang pemula jadi inilah jawaban pemula. Jika di perulangan for memberikan i yang kemudian dapat digunakan namun dibutuhkan seperti Bilangan [i] di vektor lain. Sebagian besar adalah bulu halus demi contoh, untuk / jika benar-benar mengatakan semuanya.

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;
        }
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.