如何使用迭代器更改for循环中对象的属性?

时间:2015-05-26 18:10:14

标签: c++ vector iterator

这是关于一辆汽车在十字路口进入队列的故事。

因此,对于每条道路,都有不同的车道(迭代器it),并且对于每个车道,都有不同的车辆(迭代器it2)。

void function(Road& R, int timestep) {

    vector<int> lane = R.void1() {
    for(vector<int>::iterator it = lane.begin() ; it != lane.end() ; it++) {

        vector<Car> cars = R.void2((*it));
        for(vector<Car>::iterator it2 = cars.begin() ; it2 != cars.end() ; it2 ++) {

            if((*it2).get_travel_time() >= R.get1((*it))
                  (*it2).init_travel_time();
            else
                  (*it2).incr_travel_time(timestep);
        }
    }
}

其中init_travel_timetravel的{​​{1}}设置为(*it),其中0增加incr_travel_time(timestep)的相同属性travel } (*it)

我看到的问题是,汽车的副本timestep会增加,但行(*it2)中的汽车不会增加。

相反,为了直接在汽车上增加,我尝试了:

R.void2((*it))

但我收到以下错误:

  

矢量迭代器不兼容

这是可以理解的(Vector Iterators Incompatible)。

事实上,我认为只要我的矢量不能是const(我改变它的属性)并且只要第二个答案让我回到我的第一个命题,我就不能使用答案。

1 个答案:

答案 0 :(得分:3)

要更改Road中包含的实际向量并避免创建副本,请在第一个版本中创建对向量的引用:

void function(Road& R, int timestep) {

    vector<int>& lane = R.void1();
    for(vector<int>::iterator it = lane.begin() ; it != lane.end() ; it++) {

        vector<Car>& cars = R.void2(*it);
        for(vector<Car>::iterator it2 = cars.begin() ; it2 != cars.end() ; it2 ++) {

            if(it2->get_travel_time() >= R.get1(*it))
                  it2->init_travel_time();
            else
                  it2->incr_travel_time(timestep);
        }
    }
}

此外,void1和void2应返回引用(如果不是)

vector<int>& Road::void1();
vector<Car>& Road::void2(int lane);

我还删除了代码中的冗余括号,以简化阅读。