【问题标题】:Comparing iterator and const_iterators比较迭代器和 const_iterators
【发布时间】:2017-05-02 11:44:42
【问题描述】:

我有一个方法可以找到地图中的特定位置并通过迭代器引用“返回”它:

bool Func(const int searchKey, MyMap::iterator& iter) const {
    iter = _map.upper_bound(searchKey);  // Compiler error: comparing non-const iterator and const iterator

    const bool found = iter != _map.begin();

    if(something){
        --_map;
        return true;
    }

    return false;
}

我收到编译器错误,因为 std::upper_bound() 返回一个 std::const_iterator 并将其与 std::iterator 进行比较。

我应该将upper_bound() 的返回值“转换”为非常量吗?

【问题讨论】:

标签: c++ stl iterator constants stdmap


【解决方案1】:

不,您不应该转换upper_bound 的返回值。您应该删除函数上的 const 限定符。该函数提供对地图元素的非 const 访问(通过 out 参数),因此它不应该是 const。

【讨论】:

  • 同意,还要注意“--map;”我不知道它做了什么,但它修改了应该是成员变量的“_map”。
  • 最好让我的迭代器为 const_iterator,因为我没有修改值。
【解决方案2】:
bool Func(const int searchKey, MyMap::iterator& iter) const {
    iter = _map.upper_bound(searchKey); // Compiler error: comparing non-const iterator and const iterator

此方法标记为const,但您使用-const 迭代器(iter 参数)返回_map 中的位置,将其提供给调用者non-const 访问地图的元素,因此违反了const 方法规范。

要么从Func 声明中删除const,要么返回MyMap::const_iterator&,具体取决于您要授予调用者对地图元素的访问权限。

或者你可以为Func写两个重载:一个const和一个非const,分别返回一个MyMap::const_iteratorMyMap::iterator

【讨论】:

    【解决方案3】:

    您的地图 const 合格吗?

    如果你的地图是 const 限定的,std::map::upper_bound 将返回一个 const 迭代器,如果不是它应该返回一个迭代器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2013-04-29
      • 2012-03-28
      • 1970-01-01
      • 2015-01-07
      • 2015-03-11
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多