我不明白以下几点:
#include <iostream>
#include <vector>
using namespace std;
class Date {
public:
Date(int y, int m) {
year = y;
month = m;
}
int year;
int month;
};
int main() {
vector<pair<Date, Date> > ranges;
Date date1 = Date(2000, 1);
Date date2 = Date(2000, 2);
ranges.push_back(pair<Date, Date>(date1, date2));
for (vector<pair<Date, Date> >::iterator it = ranges.begin(); it != ranges.end(); ++it) {
(*it).first.year = 2002;
pair<Date, Date> range = *it;
range.first.year = 2001;
}
cout << ranges[0].first.year << endl;
}
当我运行时,&#34; 2002&#34;输出,虽然我预计&#34; 2001&#34;。
似乎构建迭代器并不像我预期的那样工作。我可以访问range
罚款,并阅读其变量,但我无法更改它们 - 或者至少,这些更改不会改变。
我通过使用(*it)
代替投射解决了我的问题,但我想知道为什么我的投射不起作用。
答案 0 :(得分:1)
我建议使用基于范围的for循环,如下所示:
for (auto& range : ranges)
{
...
range.first.year = 2001;
...
}
您可以使用引用,如上例所示,并直接修改集合。
答案 1 :(得分:1)
在循环中
for (vector<pair<Date, Date> >::iterator it = ranges.begin(); it != ranges.end(); ++it) {
(*it).first.year = 2002;
pair<Date, Date> range = *it;
range.first.year = 2001;
}
range
是循环的局部变量。在循环的每次迭代中(只有一次迭代,因为向量只包含一个元素),该变量由向量元素值的副本初始化。因此,此局部变量的任何更改都不会影响向量的元素。载体本身没有改变。
而不是这两行
pair<Date, Date> range = *it;
range.first.year = 2001;
你可以写简单
( *it ).first.year = 2001;
在这种情况下,您将直接更改向量的元素。
或者更改向量元素值的另一种方法是使用对元素的引用,而不是创建单独的对象。例如
for (vector<pair<Date, Date> >::iterator it = ranges.begin(); it != ranges.end(); ++it) {
(*it).first.year = 2002;
pair<Date, Date> &range = *it;
range.first.year = 2001;
}
在这种情况下,使用参考时,矢量的原始元素将被更改。