【问题标题】:C++ iterator to const_iteratorC++ 迭代器到 const_iterator
【发布时间】:2011-12-07 05:42:42
【问题描述】:

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

【问题讨论】:

  • @Pubby8:甚至不需要演员表!
  • 呃,我一定搞砸了。当我尝试隐式转换它们时,我以为我遇到了编译器错误。

标签: c++ stl iterator containers const-iterator


【解决方案1】:

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

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

std::insert_iterators 是输出迭代器。这无法将它们转换为必须是前向迭代器的常规 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();

【讨论】:

    【解决方案2】:

    您可以转换它们。示例:

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

    但我想这不是您要寻找的答案。给我看代码。 :-)

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2021-02-11
      • 1970-01-01
      • 2011-09-28
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多