C++迭代器转换为const迭代器

26

在C++中,如何从某个容器类的iterator获取一个const_iterator?对于insert_iterator,如何获取一个const_iterator?最终的const_iterator应该指向与原始iterator相同的位置。


1
@Pubby8:甚至不需要类型转换! - Fred Larson
哎呀,我一定搞砸了。我以为在尝试隐式转换时会得到编译器错误。 - Thomas Eding
2个回答

31

容器需要提供可转换为const_iterator的类型作为iterator,因此您可以隐式地进行转换:

Container::iterator it = /* blah */;
Container::const_iterator cit = it;

std::insert_iterator是输出迭代器,这意味着无法将它们转换为正常的Container::iterator,后者必须是前向迭代器。

另一种插入迭代器可能允许这样做,但从标准函数获取的迭代器不会。

我猜你可以编写自己的包装器来公开受保护的成员iter,尽管如此:

template <typename Container>
class exposing_insert_iterator : public std::insert_iterator<Container> {
public:
    exposing_insert_iterator(std::insert_iterator<Container> it)
    : std::insert_iterator<Container>(it) {}
    typename Container::iterator get_iterator() const {
        return std::insert_iterator<Container>::iter;
    }
};

// ...
std::insert_iterator<Container> ins_it;
exposing_insert_iterator<Container> exp_it = ins_it;
Container::iterator it = exp_it.get_iterator();

6
你可以将它们进行转换。例如:
std::vector<int> v;
std::vector<int>::iterator it = v.begin();
std::vector<int>::const_iterator cit = it;

但我猜这不是你想要的答案。给我看代码吧。 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接