【问题标题】:erase gets const_iterator but is called with iterator (non-const)擦除获取 const_iterator 但使用迭代器(非常量)调用
【发布时间】:2016-11-11 20:02:20
【问题描述】:

在 C++11 中,std::vector::erase 作为第一个参数 const_iterator(旧的带有迭代器):

http://www.cplusplus.com/reference/vector/vector/erase/

但正如您在示例中看到的那样,它使用的不是cbegin。相反,它与begin 一起使用。 const_iteratoriterator 之间是否存在隐式转换?

【问题讨论】:

  • 存在从iteratorconst_iterator 的隐式转换,但显然不是通常相反。
  • 故事的寓意:使用可靠的参考文档。

标签: c++ c++11 stl std stdvector


【解决方案1】:

是的,iterator 的 std 容器可以(并且必须)可转换为 const_iterator

来自标准,$23.2.1/4 General container requirements [container.requirements.general] Table 100 — Container requirements

(强调我的)

X::迭代器

满足前向迭代器要求的任何迭代器类别。 可转换为 X::const_iterator

【讨论】:

    【解决方案2】:

    containers 的要求是iterator 类型必须可以隐式转换为const_iterator

    见:http://en.cppreference.com/w/cpp/concept/Container

    所以,类似下面的东西会起作用:

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

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2011-07-03
      • 2014-02-21
      • 2021-01-02
      • 2013-04-05
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多