C++迭代器到 const_iterator

发布于 2024-12-09 20:29:15 字数 142 浏览 1 评论 0原文

在 C++ 中,如何从(某个容器类的)迭代器(该容器类的)获取 const_iterator?来自 insert_iteratorconst_iterator 怎么样?生成的迭代器应该指向与原始迭代器相同的位置。

How do I acquire a const_iterator (of some container class) from an iterator (of that container class) in C++? What about a const_iterator from an insert_iterator? The resulting iterator should point at the same spot as the original does.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呆头 2024-12-16 20:29:15

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

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

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

另一种插入迭代器可能允许这样的事情,但从标准函数获得的那些则不允许。

我想您可以围绕 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();

Containers are required to provide iterator as a type convertible to const_iterator, so you can convert implicitly:

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

std::insert_iterators are output iterators. This gives no way to convert them to a regular Container::iterator which must be a forward 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:

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();
谁把谁当真 2024-12-16 20:29:15

您可以转换它们。示例:

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

但我想这不是您正在寻找的答案。显示代码。 :-)

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. :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文