我有一个容器类,它本质上是(只显示相关部分)
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/