c++ - 只为容器提供 const 迭代器有意义吗?

标签 c++ c++11 iterator

我有一个类似于下一个的容器:

class MySpecialContainer
{
    std::vector<std::tuple<InternalType, Type1, Type2>> _vec;
};

哪里Type1Type2可在容器外使用,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 是否有意义?为了它?

如果第一个问题的答案是肯定的,那么...是不是更好?

  1. 分开_vec放入 2 个容器中,一个用于 InternalType和一个 std::pair<Type1, Type2> , 保持同步并返回 const_iterator对于第二个 vector

  2. 保持 vector 不变,并制作一个仅公开 const Type1 的自定义迭代器和 const Type2

最佳答案

只公开 const 迭代器就可以了。这在标准中甚至有优先权,因为 std::set 有效地做到了这一点。从技术上讲,iteratorconst_iterator 可以是不同的类型,但您不能通过任何一种迭代器修改元素,因为这可能会破坏 set 的不变量

关于c++ - 只为容器提供 const 迭代器有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25421859/

相关文章:

c++ - 如果我在互斥量之间声明一个变量并返回它,是否需要使用 volatile 关键字?

c++ - 参数化非类型模板参数?

c++ - 编译器认为 "A(A&)"暂时接受右值?

qt - QSplitter - 隐藏拆分器部分中包含的元素时,调整该部分的大小以仅适合可见内容

c++ - 删除 vector 中间的用户定义元素

c++ - 这个问题中发生了运算符重载,但参数的数量和类型是相同的

c++ - 从另一个类中访问私有(private)数据成员

C++ vector 插入和迭代器混淆

python - 如何使用此可迭代函数取消对列表的搜索?

c++ - 使用队列在 OpenCV 中保存平移和旋转矩阵