2010-02-28 17 views
11

Şu anda bir vektörü aramak ve öğelerini test etmek için bir yineleyici kullanıyorum. (Benim yineleyici değiştirmeden) da bir sonraki elemanı test etmekİşaretçi aritmetiğini bir STL :: vector :: yineleyicide yapabilir miyim

std::vector<int>::iterator it; 
if (*it == 0); 

aynı işaretçi aritmetiği tarzı mantığı kullanabilir miyim kullanarak öğelerine erişmek?

Ben ilk o sınırları

if (it != myvec.end()) 

O zaman bu işi ben işaretçiler kullanarak beklediğiniz Will hem cari elemanı ve bir sonraki eleman

if (*it == 1 && *(it + 1) == 1) 

sınamak

dışarı yineleyici itecektir olmadığını görmek gerekir?

cevap

16

Evet, std::vector yineleyicileri random access iterators olduğundan, diğer geçerli yineleyicileri almak için integral değerler ekler/çıkarırsınız.

Teknik olarak, bu işaretçi aritmetik olmayabilir, ancak yalnızca işaretçiler gibi davranırlar.

+0

Yani, liste :: yineleyici üzerinde aritmetik işlem yapamıyorum, değil mi? – Alcott

+1

@Alcott - doğru. Bir liste :: yineleyici iki yönlü bir yineleyici ve rastgele erişimi desteklemiyor. Tek bir çağrı ile hamle yapmak için std :: advance' kullanabilirsiniz, ancak ilerlemenin karmaşıklığı, listeler için O (n) 'dir (bir vektör için O (1)' dir). –

3

Bu, vektör yineleyici rasgele erişim yineleyicisi olduğu gibi çalışacaktır. Bu, yalnızca işaretçilerle yaptığınız gibi hareket edemezsiniz, aynı zamanda işaretçiler/işaretçi aritmetiği kullanılarak uygulanmaktadır.

1

yineleyici sonra kabın son öğe üzerinde ise Eh,

*(it + 1) 

tanımsız olan davranışları. Sen

it + 1 != end 

önce çözümleyecek kontrol etmelisiniz.

+1

Bu yüzden, işaretçileri kullanmak gibi, kendinizin sınırların dışına çıkmadığını kontrol etmeniz gerekir. – Dom

İlgili konular