我有一个类似于下一个的容器:
class MySpecialContainer
{
std::vector<std::tuple<InternalType, Type1, Type2>> _vec;
};
哪里Type1
和 Type2
可在容器外使用,InternalType
仅在容器内使用。为了从外部迭代元素,我使用了一个类似于下一个的成员函数:
void MySpecialContainer::iterate(std::function<void(const Type1&, const Type2&)> fun)
{
for(auto& it : _vec)
{
fun(std::get<1>(it), std::get<2>(it));
}
}
如您所见,这种方法有几个局限性,比如不能迭代子范围或不能使用非变异 std::algorithms
.
考虑MySpecialContainer
出于逻辑考虑,元素从外部是不可改变的,仅提供 const_iterator
是否有意义?为了它?
如果第一个问题的答案是肯定的,那么...是不是更好?
分开
_vec
放入 2 个容器中,一个用于InternalType
和一个std::pair<Type1, Type2>
, 保持同步并返回const_iterator
对于第二个 vector保持 vector 不变,并制作一个仅公开
const Type1
的自定义迭代器和const Type2
最佳答案
只公开 const 迭代器就可以了。这在标准中甚至有优先权,因为 std::set
有效地做到了这一点。从技术上讲,iterator
和 const_iterator
可以是不同的类型,但您不能通过任何一种迭代器修改元素,因为这可能会破坏 set 的不变量
。
关于c++ - 只为容器提供 const 迭代器有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25421859/