很清楚为什么我们不能将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
!=
运营商出现这种行为的原因是什么?
答案 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
视图。比较两者的迭代器时,指向相同数据的两个迭代器应该比较等于。