2016-04-08 37 views
-5

嗨我有Windows 10的情況下,宣佈空類成員變量向量,但此向量的begin()(first iterator)end()(last iterator)不同,因爲我知道在空向量那些2應該是相同的。有任何想法嗎? :)))C++空std :: vector開始不等於結尾

struct B 
{ 
    std::string a; 

    std::string b; 
}; 

class A 
{ 
    A(); 

    std::vector<B> vec_;  
}; 

A::A() 
{ 

} 

在這裏,在costructor一個vec_.begin().base()不等於vec_.end().base()

其中我所知應該是平等的

+1

別看地址,只是對它們進行比較。 'operator =='應該做正確的事情。標準沒有聲明它們會返回相同的迭代器,只是它們會比較相等。 –

+0

是什麼編譯器?你將不得不發佈一個完整的代碼示例,重現此 – vu1p3n0x

+2

顯示爲一些代碼來重現 – Jeka

回答

3

該標準僅要求迭代器都是平等的,沒有,他們不會忽略是相同的。考慮迭代器的地址是毫無意義的。

正如其他人所說,這兩個迭代器是不同的對象,所以他們需要有不同的地址。

僅供參考,請參閱this answer

+0

是的,你是對的。我不清楚,迭代器是不同的。 –

+0

開始和結束的基礎是不相等的。 vec.begin()。base()!= vec.end()。base(),它應該等於 –

+0

@Irakli Darbuashvili:你在說什麼「基礎」?在C++中,只有反向迭代器纔有「基礎」。非反向迭代器不會。 'vec.begin().base()'不可編譯。你的庫實現顯然允許你在非反向迭代器上調用'base()'。這並不意味着你應該這樣做。這並不意味着這些比較的結果具有任何特定的含義。 – AnT

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

這應該工作:開始和結束比較相等。

在另一方面

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

是禁止從工作:兩個迭代器是不同的對象,必須有不同的地址。

比較等價的:

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

好吧,你是對的,但不應該v.begin()。base()== v.end()。base()? –

+0

'std :: vector :: iterator'是否有'base'方法?我只知道'reverse_iterator'。如果您需要更多幫助,現在您需要顯示您的_actual_代碼和您的平臺,否則我們只是猜測。 – Useless

+0

我也不知道,但它有這樣的方法。檢查stl_iterator頭文件 –

0

的迭代器是由返回值,所以該地址的確是不一樣的。即使你:

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

it1it2地址可以是不同的(並且會在許多實現) - 即使使用引用。

(請注意,使用兩個begin()是不是一個錯誤 - 同樣的方法begin()將返回不同的值,兩個不同的對象)

+0

它們不是_often_的值,它們是[定義的](http://en.cppreference.com/w/cpp/container/vector/begin),由值返回。 – Useless

+0

謝謝你的提示,更正。 – axalis

+0

是的,我知道,但我不清楚,開始和結束不同。這些行爲者是不同的 –

相關問題