如何获得有保证的无效迭代器(对于向量)?

时间:2018-04-25 18:04:40

标签: c++ iterator

我有一个容器类,基本上(仅显示相关部分)

class Foo {
    typedef std::map<int, std::vector<int>> data_t;
    data_t data;
    struct iterator {
        data_t::iterator major_it;
        data_t::mapped_type::iterator minor_it;
        // ...
    };
    iterator begin();
    iterator end() {
        return { data.end(), /* XXX */ };
    }
};

如您所见,我想为此容器实现迭代器。迭代器应遍历map中的每个节点,并通过节点引用的向量中的每个元素进行迭代。我没有问题实现迭代器,但是我在容器上实现end()时遇到了一些麻烦。

迭代器由两个级别的迭代器组成,对于过去的迭代器,major_it必须是data_t.end(),但我没有任何东西可以初始化{{1} }。

同样地,当地图为空时,minor_it也会被打破。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在值初始化时,

std::vector::iterator始终无效:

std::vector<…>::iterator invalid_iter_value = {};

顺便提一下,当默认初始化(即未初始化)时,它不可用,这对你来说可能已经足够了。如果major_it已经结束,则只需访问minor_it

std::vector<…>::iterator unusable_iter_value;

但是,请注意,复制默认初始化对象也是非法的,因此除非您自定义复制构造函数和运算符,否则值初始化是个好主意。