【问题标题】:How to return non-const iterator from function taking a const reference to a container如何从对容器进行 const 引用的函数返回非常量迭代器
【发布时间】:2018-07-10 01:00:21
【问题描述】:

我正在尝试编写一个模板函数来返回容器中按字典顺序排列的最后一个元素。

根据我对 const 正确性的理解,由于该函数不会修改模板参数引用,因此它应该是 const 正确的。我将如何返回非常量迭代器?

换句话说,该函数不会修改容器元素,因为它是常量,但该保证不应该扩展到返回的迭代器吗?

我想表示该函数不会修改任何内容,但返回的迭代器可以允许调用者这样做。

#include<iterator>

template<typename T>
typename T::iterator lexicographical_last(const T& container)
{
  typename T::const_iterator b, last = container.begin();
  while (b != container.end())
    {
      if (b < last) last = b;
      ++b;
    }
  return last;
}

【问题讨论】:

  • C++ 不支持这种微妙之处,抱歉。在一般情况下,您只需让函数引用非const 参数。对于一些特殊情况,例如std::vector,可以让函数只返回一个索引,而对于其他一些特殊情况,容器类型可能会提供某种方法来将返回的 const 迭代器转换为普通的变异迭代器。
  • 请注意,显示的代码 (1) 使用了可能未初始化的变量 b,并且 (2) 比较迭代器而不是它们所引用的项目。

标签: c++ c++11 templates iterator constants


【解决方案1】:

当您通过 const 引用传递“容器”时,您承诺此函数不会修改它。这包括返回一个 non-const_iterator。

如果您需要一个非 const_iterator 返回,请提供一个采用可变引用的重载

template<typename T>
typename T::const_iterator lexicographical_last(const T& container);
template<typename T>
typename T::iterator lexicographical_last(T& container);

【讨论】:

  • 这是可以理解的。我只是想确保函数不修改函数体内引用的“容器”,但也返回一个非常量迭代器的情况下不存在某些东西。有什么理由不希望或不可能吗?
  • 我认为原因是标准容器上没有返回可变引用的 const 方法。通常,规避 const 正确性通常是不好的。你需要说明为什么这个函数的调用者需要一个非常量迭代器;为了在不超载的情况下做你想做的事,你必须const_cast容器引用。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2013-01-04
  • 2021-09-05
相关资源
最近更新 更多