2009-06-23 14 views
34

Yineleyicilerle normal hesaplamalar yapabilir miyim, yani sadece bir sayı ekleyerek onu artırabilir miyim? Örnek olarakSadece bir sayı ekleyerek bir yineleyici ekleyebilir miyim?

, ben elemanını vec[3] kaldırmak istiyorsanız, sadece bunu yapabilirsiniz:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

Benim (g ++) için çalışır, ancak garantili olup olmadığından emin değilim çalışmak.

cevap

42

Yineleyici, vektör yineleyicileri olan rasgele erişim yineleyicisi ise işe yarar (bkz. reference). STL işlevi std::advance, genel yineleyiciyi ilerletmek için kullanılabilir, ancak yineleyiciyi döndürmediğinden, temiz görünüyorsa + kullanımının kullanılmasını öneririm.

C++ 11 not

konuda size şablon topraklarda çalışıyoruz hala var jenerik yineleyici ilerletmek için bunları kullanabilir ve eğer öyleyse, yineleyici dönmek yapmak std::next ve std::prev olduğu temiz kod.

+7

Oh, bu yüzden std :: list için işe yaramaz? – Frank

+2

Doğru; Hangi yineleyici türlerinde hangi işlevlerin kullanılabileceğini listeleyen bazı belge bağlantıları ekledik. –

+1

Hayır, değil. + Işleci, bir adım yineleyicisinin yapamayacağı "bir adımda, bu kadar ileriye atlamak" anlamına gelir. Forward rastgele erişimli yineleyiciler (liste yineleyicileri gibi) yalnızca bir öğeyi bir defada ilerletmek için arttırma (++) operatörünü destekler. Todd'un dediği gibi, rastgele olmayan bir yinelemeyi birkaç adım ileriye taşıma fikrini kısa ve öz bir şekilde ifade etmek için art arda ++ operatörünü tekrar eden std :: advance'i kullanabilirsiniz. –

2

Rastgele erişimli yineleyicilerle çalışır. Genel olarak daha genel olan std::advance'a bakmak isteyebilirsiniz. Sadece bu işlev şablonunu kullanmanın performans sonuçlarını anladığınızdan emin olun.

İlgili konular