2013-03-04 18 views
15

Bir vektörün olduğu bir alıştırma üzerinde çalışıyorum ve ters bir normal ve ileri (geri) yineleyici kullanarak kendi ters algoritmamı yazıyorum. vektör Ancak, yineleyicileri karşılaştırılamıyor. Vektör karşılaştır <T> :: vektörlü yineleyici <T> :: reverse_iterator

int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 
vector<int> numbers(vals, vals + 10); 

vector<int>::iterator  start = numbers.begin(); 
vector<int>::reverse_iterator end = numbers.rend(); 

Ben ancak bu görevi Aralarında! = Operatörünü kullanarak bunları karşılaştırmak mümkün değilim, iki iterators kullanarak vektör geri çevrilmesine yönelik önceki algoritma var. Tahminim, vektördeki temel işaretçiler veya indeksleri birbirimizle paylaşmak olurdu, ancak işaretçileri/endeksleri nasıl alabilirim?

+0

Alıştırmalarınız için iki ileri yineleyici kullanmak daha kolay olacaktır: (for :: iterator i = numbers.begin(), j = numbers.end(); i

cevap

13

base() tarafından döndürülen yineleyiciyi kullanarak bir karşılaştırma yapın: it == rit.base() - 1.

+2

Yine de dikkatli olun. Eğer rit bir son yineleyiciyse (yani, ters yineleme), sonra rit.base() '' numbers.begin() 'dır ve ondan 1 çıkarır. Bir alternatif, mesafe (numbers.begin(), it) == mesafe (rit, numbers.rend()) - 1 'karşılaştırmaktır. –

+0

Teşekkürler :) İşte benim egzersizimin sonucudur: http://pastebin.com/mEv2uJ2F – Martin

+1

@SteveJessop: ve tabii ki, '1 'genel olarak BidirectionalIterator'lara uygulanamayan ancak sadece RandomAccessIterators' e uygulanamaz. Bu nedenle @wilx tarafından sağlanan kod 'liste' için çalışmaz. –

4

base() numaralı telefonu arayarak reverse_iterator'u iterator'a dönüştürebilirsiniz. Ancak, bazı uyarılar olduğu için dikkatli olun. @Matthieu M.'nin comment özellikle yararlıdır:

Not: base() aslında reverse_iterator bağlantı verdiği öğeyi takip elemanı bir iterator döndürür.

+4

Not:' base() 'aslında,' reverse_iterator' öğesinin işaret ettiği öğeyi * izleyerek bir 'yineleyici 'döndürür. –

+0

@Matthieu M .: Evet, bu yazacağım ilk uyarı oldu - ama şimdi yaptığın, artık daha fazla düşünmem gerektiğini düşünüyorum. Teşekkürler! – Reunanen

+0

@TobySpeight: haklısın, ben de tam olarak bunu yaptım. – Reunanen

0

Doğrudan yineleyicinin işaret ettiği adresi karşılaştırmak için (&*start == &*(end - 1)) kullanabilirsiniz.

+2

Yapabilirsin ... ama yapmalısın? :) – BartoszKP

+0

Bu, soruya cevap vermiyor. OP, bir yineleyicinin bir start_rücüne nasıl karşılaştırılacağını sordu, başlangıç ​​ve bitiş-1 öğelerinin adreslerini karşılaştırmak için değil. – RichS

İlgili konular