如何使用迭代器更改 for 循环中对象的属性?
How to change an attribute of an object in a for loop with iterators?
这是一个关于汽车在十字路口排队的故事。
所以,对于每条路,有不同的车道(迭代器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)
递增 travel
的相同属性 travel
=16=] 来自 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 iterator incompatible
这是可以理解的 (Vector Iterators Incompatible)。
事实上,我认为只要我的向量不能是 const(我改变它的属性)并且只要第二个答案让我回到我的第一个命题,我就不能使用答案。
要更改 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 应该 return 引用(如果不是)
vector<int>& Road::void1();
vector<Car>& Road::void2(int lane);
我还删除了代码中多余的括号以简化阅读。
这是一个关于汽车在十字路口排队的故事。
所以,对于每条路,有不同的车道(迭代器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)
递增 travel
的相同属性 travel
=16=] 来自 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 iterator incompatible
这是可以理解的 (Vector Iterators Incompatible)。
事实上,我认为只要我的向量不能是 const(我改变它的属性)并且只要第二个答案让我回到我的第一个命题,我就不能使用答案。
要更改 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 应该 return 引用(如果不是)
vector<int>& Road::void1();
vector<Car>& Road::void2(int lane);
我还删除了代码中多余的括号以简化阅读。