2016-04-08 38 views
-5

sonuna kadar eşit olmayacak. Merhaba, boş sınıf üyesi değişken vektörünü açıklayan pencerelerde 10 durumum var, ancak bu vektörün begin()(first iterator) ve end()(last iterator) farklı olduğunu bildiğim gibi, bu 2 aynı olmalıdır. Herhangi bir fikir? :))) costructor içinde İşteC++ empty std :: vektör,

struct B 
{ 
    std::string a; 

    std::string b; 
}; 

class A 
{ 
    A(); 

    std::vector<B> vec_;  
}; 

A::A() 
{ 

} 

A vec_.begin().base() değil eşittir ben

+1

sadece bunları karşılaştırmak, adresler bakmayın -

(farklı değerlerle iki farklı nesneleri dönecektir aynı yöntem begin() hem begin() kullanarak bir hata olmadığını unutmayın). operatör == doğru olanı yapmalı. Standart, aynı yineleyiciyi döndüreceklerini, yalnızca eşit olarak karşılaştırdıklarını beyan etmez. –

+0

hangi derleyici? Bu – vu1p3n0x

+2

yeniden üreten tam bir kod örneği göndermek zorunda kalacaksınız – Jeka

cevap

3
standart sadece yineleyiciler eşit olmasını gerektirir

, değil onların adresleri eşit olmalıdır bildiği gibi vec_.end().base()

aynıdır. Yineleyicilerin adresleri dikkate alındığında anlamsızdır.

Diğer belirtildiği gibi, iki yineleyici farklı nesnelerdir, bu nedenle farklı adreslere sahip olmaları için gerekir.

Başvuru için bkz. this answer.

+0

Evet haklısınız. Net değil, yineleyiciler farklı. –

+0

Başlangıcın sonu ve sonu eşit değildir. vec.begin(). base()! = vec.end(). base(), eşit olmalıdır –

+0

@ Irakli Darbuashvili: Ne "üs" hakkında konuşuyorsun? C++ 'da sadece ters yineleyiciler "üsleri" vardır. Ters olmayan yineleyiciler yok. vec.begin(). base() 'bir araya getirilemez. Kütüphane uygulamanız görünüşte bir şekilde ters olmayan yineleyicilerde 'base() 'aramanızı sağlar. Bu yapman gerektiği anlamına gelmez. Ve bu, bu tabanların karşılaştırmasının sonucunun belirli bir anlamı olduğu anlamına gelmez. – AnT

1
std::vector<int> v; 
assert(v.begin() == v.end()); 

Bu işe yaramalı: başlangıç ​​ve bitiş eşittir. Öte yandan

auto b = v.begin(); 
auto e = v.end(); 
assert(&b == &e); 

günü

çalışmasını yasak geçerli: İki yineleyiciler farklı nesnelerdir ve farklı adresleri olmalıdır.

int i = 42; 
int j = 42; 
assert(i == j); // ok 
assert(&i == &j); // fail 
+0

Tamam, haklısın, ama v.begin(). Base() == v.end(). Base()? –

+0

'std :: vektör :: yineleyici' bir 'base' yöntemine sahip mi? Sadece 'reverse_iterator' için bunun farkındaydım. Şimdi daha fazla yardım istiyorsanız, _actual_ kodunu ve platformunuzu göstermeniz gerekiyor, yoksa sadece tahmin ediyoruz. – Useless

+0

Ayrıca bilmiyordum ama böyle bir yöntemi var. Stl_iterator başlık dosyasını kontrol edin –

0

yineleyiciler değeriyle döndürülür, böylece adresin gerçekten aynı olmayacak:

eşdeğer karşılaştırın. Tek yapmanız bile: it1 ve it2 ait

const vector<whatever>::iterator &it1 = vect.begin(); 
const vector<whatever>::iterator &it2 = vect.begin(); 

adresleri farklı olabilir (ve birçok uygulamalarda olacaktır) - referanslar kullanılsa bile.

+0

Değer olarak döndürülen _often_ değiller, değer olarak döndürülen [tanımlı] (http://en.cppreference.com/w/cpp/container/vector/begin). – Useless

+0

Not için teşekkürler, düzeltildi. – axalis

+0

Evet Biliyorum, ama açık değildi, başlangıç ​​ve bitiş farklı. İticiler farklı –