0

基于Iter的实现,我很难理解operator!=并且不明白为什么它不检查_p_vec

这是operator!=仅比较_pos.

class Iter
{
    public:
    Iter (const IntVector* p_vec, int pos)
        : _pos( pos )
        , _p_vec( p_vec )
    { }

    // these three methods form the basis of an iterator for use with
    // a range-based for loop
    bool operator!= (const Iter& other) const
    {
        return _pos != other._pos;
    }
    ...
    ...
    private:
        int _pos;
        const IntVector *_p_vec;
};

但是,我认为正确的方法如下。换句话说,我们必须比较两者_pos_p_vec

bool Iter::operator!= (const Iter& other) const
{
    return _p_vec != other._p_vec || _pos != other._pos;
}

问题> 谁的代码是正确的?

===更新 std::vector 如何比较迭代器====

std::vector<int> vecOne { 1, 2, 3};
std::vector<int> vecTwo { 4, 5, 6};

auto iterOne = vecOne.begin();
std::advance(iterOne, 1);

auto iterTwo = vecTwo.begin();
std::advance(iterTwo, 1);

if ( iterOne == iterTwo)
    std::cout << "iterOne == iterTwo" << std::endl;
else
    std::cout << "iterOne != iterTwo" << std::endl;

输出是:iterOne != iterTwo

然而,

std::vector<int> foo;
std::vector<int> bar;

if ( foo.begin() == bar.begin() )
    std::cout << "foo.begin() == bar.begin()" << std::endl;
else
    std::cout << "foo.begin() != bar.begin()" << std::endl;

输出是:foo.begin() == bar.begin()

GCC(版本 4.7.1)

4

2 回答 2

2

作为一般规则,迭代器的用户不应该比较来自不同容器的迭代器。在标准库中,这样做是未定义的行为。

因此,假设您只是尝试创建与标准库迭代器一样健壮的迭代器,则不需要比较容器。但是,如果您有指向容器的指针,那么检查容器是否至少在 debug中匹配是礼貌的,然后断言您不应该进行这种比较。

您也可以自由地在版本中检查它,但是如果您使用代码的迭代器也应该与标准容器一起使用,那么不建议依赖来自不同容器的迭代器比较不相等。

请参阅比较来自不同容器的迭代器,以便有人谈论它如何是未定义的行为。

于 2013-02-01T16:09:58.843 回答
2

比较底层容器引用也是一种改进,可以确保例如begin()两个不同容器的迭代器比较相等。

然而,不同容器的迭代器很少被比较(当使用 STL 算法时,他们永远不会)。所以这可能被认为是一种优化。考虑一个循环,您从begin()end(),因此您要比较的唯一迭代器是“当前”迭代器 和end(),它们属于同一个容器。

比较标准容器(向量等)的迭代器被认为是未定义的行为。实际上,由于它们从未在(好的)代码(例如标准算法)中进行比较,因此不必为这种情况定义行为。

所以这个Iter类的作者可能还想回到这一点并说:“比较不同向量的迭代器是未定义的行为。”

话虽如此,如果您想确保从不比较不同容器的迭代器,请忽略此检查,并可能在调试版本中对其进行断言(但不要在发布版本中进行检查)。

您可能想要比较不同容器的迭代器的一个很好的例子是链表,您将链表的结尾定义为空指针(或指向静态空项实例的指针)。考虑迭代器是指向链表项的指针;在这种情况下,end()迭代器只是一个空指针(或指向这个空项)。所有容器都是同一个,因此在这种情况下,您无法在比较方法中实施检查。也许这是没有定义这种比较的原因之一——在比较不同列表的结束迭代器时它应该返回“不相等”,但它不能

于 2013-02-01T16:04:16.967 回答