使用c ++ stl迭代器而不是传统指针的正确方法是什么?

时间:2013-08-14 14:54:31

标签: c++ stl

我有以下非常基本的问题。我想使用stl迭代器而不是传统的C类型指针来填充函数中的数组。通过C风格的方式,我的意思是以下示例:

void f(double* v, size_t n) {
    for (int i = 0; i < n; i++) 
         v[i] = 10;    /* a more reasonable value in practice! */
}

我会使用迭代器将其转换为C ++样式,如下所示:

void f(vector<double>::const_iterator first, vector<double>::const_iterator last) {
    for(vector<double>::iterator it =  first; it != last; it++)
        *it = 10;
}

但是我收到了编译错误。如果我使用iterator代替const_iterator,则问题将得到解决。但是,我想知道这是否正确?因为我认为vector.begin()vector.end()迭代器是常量。

提前致谢!

5 个答案:

答案 0 :(得分:5)

之间的区别
const vector<double>::iterator

vector<double>::const_iterator

double * const vconst double *v之间大致相同:

  • 第一个说迭代器必须保持不变,但它指向的内容可以改变
  • 第二个说迭代器本身是可变的,但它指的是const

如果您将该功能重写为

void f(const vector<double>::iterator first, const vector<double>::iterator last) {
    for(vector<double>::iterator it =  first; it != last; it++)
        *it = 10;
}

它可以编译并正确运行。

答案 1 :(得分:4)

你看到的是因为const_iterator大致对应于指向const的指针。因此,您可以更改迭代器的值,即将其指向其他位置,但不能修改它指向的内容。

这与const迭代器不同,后者不允许递增或递减它们。这是一个例子:

#include <vector>

int main() {
  std::vector<int> v{ 1, 2, 3 };

  std::vector<int>::const_iterator i = v.begin();
  *i = 10;                                         // ERROR!
  ++i;                                             // OK

  std::vector<int>::iterator const ci = v.begin();
  *ci = 10;                                        // OK
  ++ci;                                            // ERROR!
}

答案 2 :(得分:1)

std::fill(my_vector.begin(), my_vector.end(), 10);

答案 3 :(得分:0)

由于您使用const_iterator,因此无法修改矢量。使用非const iterator是正确的做法。

在回答您的上一个问题时,vector.begin()vector.end()同时包含const_和非const_。如果你的向量是非常量的,你将得到一个非const_迭代器。请参阅std::vector::begin的文档。

答案 4 :(得分:0)

问题是你的函数需要const_iterator,但你的循环需要iterator,因为你想要修改数据。解决方案当然是让你的函数立即使用iterator,因为它显然意味着修改范围。

这与vector.begin()返回的内容无关。对于const对象或引用,它们将返回const_iterator个,否则它们将返回iterator个。但是你的函数肯定需要iterator s,因为它修改了传递给它的范围内的值。