3

我有以下非常基本的问题。我想使用 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()

提前致谢!

4

5 回答 5

5

和...之间的不同

const vector<double>::iterator

vector<double>::const_iterator

double * const v与 between和大致相同const 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;
}

它会正确编译和运行。

于 2013-08-14T14:59:11.433 回答
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!
}
于 2013-08-14T14:58:12.987 回答
1
std::fill(my_vector.begin(), my_vector.end(), 10);
于 2013-08-14T15:25:34.790 回答
0

由于您使用的是const_iterators,因此您无法修改向量。使用非常量iterator是正确的做法。

在回答您的最后一个问题时,vector.begin()既有vector.end()实现const_又有非const_实现。如果你的向量是非常量的,你会得到一个非const_迭代器。请参阅std::vector::begin的文档。

于 2013-08-14T14:58:47.680 回答
0

问题是你的函数需要const_iterators 但你的循环需要一个iterator,因为你想修改数据。解决方案当然是让您的函数iterator立即使用 s,因为它显然是为了修改范围。

vector.begin()这与返回的内容没有任何关系。对于const对象或引用,它们将返回const_iterators,否则它们将返回iterators。但是您的函数肯定需要iterators,因为它会修改传递给它的范围内的值。

于 2013-08-14T15:00:47.013 回答