我有以下非常基本的问题。我想使用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()
迭代器是常量。
提前致谢!
答案 0 :(得分:5)
之间的区别
const vector<double>::iterator
和
vector<double>::const_iterator
与double * const v
和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;
}
它可以编译并正确运行。
答案 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,因为它修改了传递给它的范围内的值。