[c++] 为什么标准迭代器范围[开始,结束]而不是[开始,结束]?


2 Answers

为什么标准将end()定义为一个结束,而不是实际结束?

因为:

  1. 它避免了空白范围的特殊处理。 对于空范围, begin()等于end()
  2. 它使遍历元素的循环的结束标准变得简单:只要未达到end() ,循环就会继续。
Question

为什么标准将end()定义为一个结束,而不是实际结束?




使用end()指向末尾,可以很容易地用for循环迭代集合:

for (iterator it = collection.begin(); it != collection.end(); it++)
{
    DoStuff(*it);
}

end()指向最后一个元素,循环会更复杂:

iterator it = collection.begin();
while (!collection.empty())
{
    DoStuff(*it);

    if (it == collection.end())
        break;

    it++;
}



因为那样

size() == end() - begin()   // For iterators for whom subtraction is valid

而且你不需要做一些尴尬的事情

// Never mind that this is INVALID for input iterators...
bool empty() { return begin() == end() + 1; }

而且你不会意外地写错误的代码

bool empty() { return begin() == end() - 1; }    // a typo from the first version
                                                 // of this post
                                                 // (see, it really is confusing)

bool empty() { return end() - begin() == -1; }   // Signed/unsigned mismatch
// Plus the fact that subtracting is also invalid for many iterators

另外: 如果end()指向一个有效的元素, find()返回什么?
真的想要另一个invalid()成员返回一个无效的迭代器吗?!
两个迭代器已经够痛苦了......

哦, 看到this相关的帖子

也:

如果end在最后一个元素之前,那么如何在真正的末尾insert()




Related