将迭代器强制转换为一对对象

时间:2014-11-25 08:15:00

标签: c++ casting iterator

我不明白以下几点:

#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)代替投射解决了我的问题,但我想知道为什么我的投射不起作用。

2 个答案:

答案 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;
}

在这种情况下,使用参考时,矢量的原始元素将被更改。