c++ - 如何获得保证无效的迭代器(对于 vector )?

标签 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 */ };
    }
};

如您所见,我想为这个容器实现迭代器。迭代器应遍历映射中的每个节点,迭代器应遍历该节点引用的 vector 中的每个元素。我在实现迭代器时没有问题,但在为容器实现 end() 时遇到了一些问题。

迭代器由两级迭代器组成,对于后尾迭代器,major_it 必须是data_t.end(),但我不会有什么东西可以初始化 minor_it

同理,本地图为空时,begin()也会被打破。

有什么想法吗?

最佳答案

std::vector::iterator 在值初始化时总是无效的:

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

顺便说一句,它在默认初始化(即未初始化)时不可用,这对您来说可能已经足够了。如果 major_it 已经在最后,那么就不要访问 minor_it

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

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

关于c++ - 如何获得保证无效的迭代器(对于 vector )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028711/

相关文章:

c++ - 用于 protobuf 转换的 Braced-init 样式构造函数

c++ - 过滤模板函数的特定迭代器

c++ - 从 vector C++ 添加 int 元素时出错

c++ - 从文件中读取选定范围的行并存储到数组中

c++ - C++ 中的暴力字符生成

c++ - 为什么 vector::push_back 和 emplace_back 调用 value_type::constructor 两次?

c++ - unordered_map cbegin() + number//常数复杂度?

javascript - 迭代状态变量

c++ - 删除结束迭代器是对标准的疏忽还是设计决策?

c++ - 整数散列问题