2016-03-28 13 views
1

Ben bir segment hataya olsun bu satırda myvector.begin() + 1 kullanarak kodukullanma std :: artırılır iterasyon ile bulmak

std::vector<char> myvector = {'u', 'd', 'l', 'r', 'u'}; 
std::vector<char>::iterator it; 

std::cout << "vector size = " << myvector.size() << std::endl; 
std::cout << "myvector.begin() = " << *(myvector.begin()+1) << std::endl; 
it = find (myvector.begin() + 1, myvector.end(), *myvector.begin()); 
if (it != myvector.end()) 
{ 
    myvector.erase(myvector.begin()); 
    myvector.erase(it); 
    std::cout << "Found and deleted " << '\n'; 
    std::cout << "vector size = " << myvector.size() << std::endl; 
} 
else 
    std::cout << "Element not found in myvector\n"; 

aşağıdakilere sahip Sağlar ki ve neden hiçbir fikrim yok.

it = find (myvector.begin() + 1, myvector.end(), *myvector.begin()); 

Normalde yineleyiciyi aritmetik ile artırabilmem gerekir. std::advance veya std::next gibi başka çözümler denedim, ancak hiç bir başarı elde etmedim.

Herhangi bir öneriniz var mı?

@And evet, ne ulaşmak istediğiniz eleman varsa o çoğaltmak ve onlara

+0

Hata ayıklayıcısında programınızı çalıştırdığınızda hata hangi satırı yaptı? – kfsone

cevap

0

çizgi (ler)

myvector.erase(myvector.begin()); 
myvector.erase(it); 

sorunlu hem kaldırmak kontrol etmektir. İlk elemanı sildikten sonra, diğer tüm yineleyiciler geçersiz sayılır, bkz. the documentation. Hatların sırasını değiştirmek kodu geçerli kılmalıdır.

Live example on Coliru

+0

Beni aldattığımı, uykuya gitmem gerektiğini ispatladığımı kanıtla (buradayım. <) –

+0

@JohnnieW Ha ha, evet, işaretçiler ya da yineleyiciler uykusuzlukla iyi uyuşmuyor. Ve btw, ham iterator aritmetiği yerine 'std :: next' komutunu kullanın. – vsoftco

+0

herhangi bir öneri neden bunu yapmalıyım? Bu kadar basit vektörler ile çalışırken bildiğim kadarıyla ham aritmetik bana zarar vermemelidir :) –

0

Ben segmentasyon hatası senin düşündüğün satırda olacak inanmıyorum. O kısımda yanlış bir şey göremiyorum.

burada tanımlanmamış bir davranışla yapın: Bir std::vector üzerine,

myvector.erase(myvector.begin()); 
myvector.erase(it); 

silme(), silme noktadan sonra tüm yineleyiciler geçersiz kılmaktadır. Bu durumda ilk silme(), it değerini geçersiz kılacaktır. Bu durumda, , it, yineleyici kullanacağınız, en sık kullanılan std::vector uygulamasıyla, ikinci erase(), aslında "myvector.erase (myvector.end());" olacaktır.

Değil koşer.

Bu durumda, vektör yineleyicilerinin herhangi bir davranışına güvenmemelisiniz ve sadece silme() çağrılarının sırasını çevirmelisiniz.

+0

Cevabınız için teşekkürler, bu cevabın cevabını çözüm olarak seçtim çünkü cevaplayan ilk kişi oydu, umarım anlarsınız :) –

İlgili konular