【问题标题】:How to change an attribute of an object in a for loop with iterators?如何使用迭代器在 for 循环中更改对象的属性?
【发布时间】:2015-05-26 18:10:14
【问题描述】:

这是一个关于汽车在十字路口排队的故事。

因此,对于每条道路,有不同的车道(迭代器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_time(*it)travel 设置为0,其中incr_travel_time(timestep)(*it) 的相同属性travel 递增timestep

我看到的问题是汽车的副本(*it2) 增加了,但R.void2((*it)) 行中的汽车没有增加。

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

void function(Road& R, int timestep) {      
    for(vector<int>::iterator it = R.void1().begin() ; it != R.void1().end() ; it++) {    
        for(vector<Car>::iterator it2 = R.void2((*it)).begin() ; it2 != R.void2((*it)).end() ; it2 ++) {

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

但我收到以下错误:

向量迭代器不兼容

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

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

【问题讨论】:

  • 请给我们更详细的错误日志。顺便说一句:记住(*ptr). 等价于ptr-&gt;
  • 可能您的 R.void1()R.void2((*it)) 两种方法都返回副本但不返回引用,因此您正在迭代对象的副本。老实说,您的代码非常肮脏。请显示此方法的实现。
  • @VictorPolevoy :我对 C++ 和自学者还很陌生。所以我很高兴能理解为什么我的代码很脏以及有哪些可能的方法可以让它变得更好(实际上,下面的functionvoid1void2……没有这样的名字)

标签: c++ vector iterator


【解决方案1】:

要更改 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);

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

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2022-12-08
    • 2021-11-24
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多