运算符!= stdlibrary中的迭代器

时间:2015-07-06 15:55:13

标签: c++ iterator

很清楚为什么我们不能将const_iterator分配给迭代器。

std::vector<int> v;
std::vector<int>::iterator i = v.cbegin(); //no viable convertion

但他们在!=运算符的立场上比较相等这一事实似乎非常令人困惑。

std::vector<int> v;
for(int i = 0; i < 10; i++)
    v.push_back(i);
for(std::vector<int>::const_iterator i = v.cbegin(); i!= v.end(); i++)
    std::cout << *i << std::endl; //prints 0-9

!=运营商出现这种行为的原因是什么?

1 个答案:

答案 0 :(得分:2)

将一个const迭代器分配给迭代器会破坏迭代器的const正确性。考虑:

 typedef std::vector<int> seq;
 const seq v;
 seq::const_iterator = v.cbegin(); // Okay
 // seq::iterator = v.begin(); // Not okay, sequence is const

如果你可以将一个const迭代器分配给一个简单的迭代器,上面的例子就可以操作const序列的内容。

比较两个迭代器只是告诉你它们是否指向某个序列的相同数据(或结束/开始)。

 typedef std::vector<int> seq;
 seq v;
 const seq& cv = v;
 cv.cbegin() == v.begin(); // Okay
 cv.cbegin() != v.begin(); // Also okay

这里有序列和相同序列的const视图。比较两者的迭代器时,指向相同数据的两个迭代器应该比较等于。