从 const 方法返回一对向量迭代器

Posted

技术标签:

【中文标题】从 const 方法返回一对向量迭代器【英文标题】:Return pair of vector iterators from a const method 【发布时间】:2020-07-17 08:54:19 【问题描述】:

我尝试从 const 方法返回一对向量迭代器。

pair<vector<double>::iterator, vector<double>::iterator> Matrix::GetColumn(int j) const 
  return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_,
                                                                  values_.begin() + (j + 1) * height_);

我在编译时收到以下错误

matrix.cc:119:133: error: no matching function for call to ‘std::pair<__gnu_cxx::__normal_iterator<double*, std::vector<double> >, __gnu_cxx::__normal_iterator<double*, std::vector<double> > >::pair(__gnu_cxx::__normal_iterator<const double*, std::vector<double> >, __gnu_cxx::__normal_iterator<const double*, std::vector<double> >)’
   return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_, values_.begin() + (j + 1) * height_);
                                                                                                                                     ^

迭代器是指向vector&lt;double&gt; 开头和结尾的指针,允许用户编辑向量中的值。 AFAIK 这不超出const 的范围吗?

这个类看起来像这样:

class Matrix 
    int height_;
    int width_;
    vector<double> values_;

当我删除 const 时,错误消失了。

【问题讨论】:

成员是constconst 方法中,因此values_.begin() 返回const_iterator,而不是iterator 感谢您的回答@mch。另一个问题: const 方法总是返回 const 值吗?我知道这个方法不应该改变this,但是调用者呢? @matthiasbe 不,但是在这样的函数中访问成员是const,并且“const”向量不能公开iterator,只能公开const_iterator。所以这不是一般规则,但你会经常遇到这种模式。这确实是为了保护对象不仅不受函数本身的影响,而且不受调用者的影响。 @mch 请不要在 cmets 中回答 【参考方案1】:

一个 const 函数不能改变类的状态,所以它只能返回一个 const_iterator。

如果它返回一个非常量迭代器,其副作用是允许外部范围(调用代码)改变类的状态。这意味着 const 函数允许修改类的状态,即使它是间接的(即不在该函数的范围内发生)。

这违反了 const 关键字所暗示的约定。

【讨论】:

以上是关于从 const 方法返回一对向量迭代器的主要内容,如果未能解决你的问题,请参考以下文章

向量、迭代器和 const_iterator

向量迭代器 + 偏移超出范围

如何正确声明从非常量迭代器到指针的 const 指针

C++ STL map迭代器

从 const char* 到迭代器错误的“未知转换” - 另一种方法

c++:从vector::insert返回迭代器