【问题标题】:using std::vector::erase with const_iterators使用带有 const_iterators 的 std::vector::erase
【发布时间】:2014-01-20 05:28:37
【问题描述】:

我有一个返回 vector<string>::const_iterator 的函数。当我尝试将此返回值用作vector<string>::erase 的参数时,我收到一个错误,即const_iteratoriterator 之间的转换是不可能的。有没有办法在不改变我的函数的返回值类型的情况下规避这个问题?谢谢!

【问题讨论】:

  • 如果你想将它用作iterator,为什么要给它一个const_iterator返回类型?
  • 在 C++11(你标记的)中实际上应该允许这样做
  • @Beta 函数基类将其定义为不允许返回常规迭代器的 const 函数。
  • 请教这个问题。有多种方法可以将iterator 发送给同一成员,甚至可能是安全的方法。我的观点是,正确使用const 是一个安全功能,一种让你不应该做的事情变得困难的方法。如果你把它放在那里,为什么不删除它?如果有人把它放在那里,你确定你知道为什么吗?
  • 谢谢,明白了。

标签: c++ c++11 vector iterator


【解决方案1】:

在 C++11 中,std::vector::erase 的两个变体都接受 const_iterator,尽管在标准的早期版本中并非如此(C++11 §23.3.6.5 [vector.modifiers])。看起来您要么 (a) 不将代码编译为 C++11,要么 (b) 使用尚未完全更新到 C++11 的标准库。

解决方法相当简单:给定一个引用向量v 成员的const_iterator ci,您可以将等价的iterator 推导出为v.begin() + (ci - v.begin())

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2015-01-04
    相关资源
    最近更新 更多