简体   繁体   English

C++ 迭代器到 const_iterator

[英]C++ iterator to const_iterator

How do I acquire a const_iterator (of some container class) from an iterator (of that container class) in C++?如何从 C++ 中的iterator (该容器类的)获取const_iterator (某个容器类的)? What about a const_iterator from an insert_iterator ?来自insert_iteratorconst_iterator怎么样? The resulting iterator should point at the same spot as the original does.生成的iterator应该指向与原始iterator相同的位置。

Containers are required to provide iterator as a type convertible to const_iterator , so you can convert implicitly:容器需要提供iterator作为可转换为const_iterator的类型,因此您可以隐式转换:

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

std::insert_iterator s are output iterators. std::insert_iterator是输出迭代器。 This gives no way to convert them to a regular Container::iterator which must be a forward iterator.这无法将它们转换为必须是前向迭代器的常规Container::iterator iterator。

Another kind of insert iterator may allow such a thing, but those obtained from the standard functions don't.另一种插入迭代器可能允许这样的事情,但那些从标准函数中获得的则不允许。

I guess you can write your own wrapper around std::insert_iterator that exposes the protected member iter , though:我想您可以围绕std::insert_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();

You can convert them.你可以转换它们。 Example:例子:

std::vector<int> v;
std::vector<int>::iterator it = v.begin();
std::vector<int>::const_iterator cit = it;

But I guess that is not the answer you are seeking.但我想这不是你想要的答案。 Show me code.给我看代码。 :-) :-)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM