İnts vektöründe bir dizin olarak kullanmak için dizeler vektöründeki belirli bir öğenin konumunu nasıl elde edebilirim?


100

Bir vektördeki bir elemanın indeksini elde etmeye çalışıyorum strings, onu başka bir inttip vektöründe indeks olarak kullanmak mümkün mü?

Misal:

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

Şimdi old_name, Namesvektördeki belirli öğelere erişimde kullanmak için vektörün konumunu elde etmek istiyorum Numbers. Böylece şunu söyleyebilirim:

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

Kullanmayı denedim:

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

ama açıkçası bu çalışmıyor çünkü posstring türünde!



Std :: map veya std :: unordered_map kontrol etmelisiniz.
Etherealone

Yanıtlar:


159

Öğeyi gösteren bir yineleyiciyi bilen bir vektördeki bir öğenin konumunu elde etmek için yineleyiciden çıkarmanız yeterlidir v.begin():

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

Şimdi kontrol etmeniz gerekir poskarşı Names.size()o sınırları veya olmasın dışarı olup olmadığını görmek için:

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

vektör yineleyiciler, dizi işaretçilerine benzer şekilde davranır; işaretçi aritmetiği hakkında bildiklerinizin çoğu vektör yineleyicilere de uygulanabilir.

C ++ 11 ile başlayarak, std::distancehem yineleyiciler hem de işaretçiler için çıkarma yerine kullanabilirsiniz :

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

Maalesef @ Bob__ adlı kişinin yorumlarını göremiyorum, silinmiş olabilir mi? Nedenini merak ediyorum ptrdiff_tdaha iyidir size_tçünkü ptrdiff_t imzalı ve imzasız tamsayı arasındaki karşılaştırmanın bir uyarı gündeme getireceğini
hiraku

3
@Hiraku Yorumunu sildi. Kullanmayı önerdi ptrdiff_tçünkü herhangi bir yineleyici çifti arasındaki mesafeyi, sonucun negatif olduğu durumlarda bile aynı kapta saklamanıza izin veriyor. Kullandığımız Eğer size_tdikkatli olmalıyız değil daha küçük bir İlerleticiden daha büyük bir yineleyici çıkarmak.
dasblinkenlight

Daha kesin olmak gerekirse, "#include <algorithm>" eklemelisiniz (std :: find kullanmak için). Sorunun yazarı bu "dahil etme" yi de atladı.
Grag2015

92

Bir dizin istiyorsanız, std::findile kombinasyon halinde kullanabilirsiniz 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
neden sabit yineleyiciler kullanılmıyor?
dani

-1

Ben bir acemiyim, bu yüzden işte yeni başlayanlar için bir cevap. For döngüsündeki if, başka bir vektördeki Numaralar [i] gibi kullanılabilecek ancak kullanılabilecek i'yi verir. Çoğu, örnekler uğruna kabartmalı, for / if gerçekten her şeyi söylüyor.

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;
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.