2013-02-26 14 views
64

Ben bu mümkün, int türde başka vektör bir endeks olarak kullanmak için, strings bir vektör bir öğenin dizinini almaya çalışıyorum?Dizeleri vektöründe belirli bir öğenin konumu, ints vektöründe bir dizin olarak kullanmak nasıl?

Örnek:

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 Numbers vektör belirli elemanı erişimde kullanmak, Names vektörü içinde old_name konumunu almak istiyorum. kullanılarak

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

Denedim:

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

ama pos dize türünde olduğu besbelli bu çalışmazsa Böylece diyebilirim!

+0

http://stackoverflow.com/questions/1425349/how-do-: Eğer yineleyiciler ve işaretçiler her ikisi için çıkarma yerine std::distance kullanabilirsiniz C++ 11 ile başlayarak

Ben-bul-bir-öğe-in-stdvector –

+0

std :: harita veya std :: unordered_map kontrol etmelisiniz. – Etherealone

cevap

118

, basitçe İlerleticiden v.begin() çıkarma elemana işaret bir yineleyici bilerek bir vektör içinde bir elementin bir pozisyon almak için o sınırların veya olmasın dışarı:

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

vektör yineleyiciler dizi işaretçiler benzer şekillerde davranırlar; İşaretçi aritmetiği hakkında bildiğiniz şeylerin çoğu, vektör yineleyicilere de uygulanabilir.

ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_)); 
Bu should tahmin
+0

Üzgünüz, @Bob__ adlı kullanıcının yorumları göremiyorum, belki silindi mi? Ben ptrdiff_t' @Hiraku Onun yorumunu sildin imzalı ve imzasız tamsayı – Hiraku

+1

arasındaki karşılaştırmanın bir uyarı gündeme getireceğini 'ifadesi ptrdiff_t' beri size_t' 'daha iyidir neden' ​​merak ediyorum. "Ptrdiff_t" kullanmayı önerdi çünkü sonuç negatif olduğunda bile, herhangi bir yineleyici çifti arasındaki mesafeyi aynı kapsayıcıya yerleştirmenize izin veriyor. Eğer size 'size_t' kullanırsak, daha küçük bir yineleyiciden daha büyük bir yineleyici çıkarmamak için dikkatli olmalıyız. – dasblinkenlight

69

Dizin istiyorsanız, std::find ürününü std::distance ile birlikte kullanabilirsiniz.

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

Şimdi olmadığını görmek için Names.size() karşı pos kontrol etmek gerekir:

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

neden const-iterators kullanmıyorsunuz? – dani

İlgili konular