2016-11-06 110 views
1

我遍历结构向量中的一组元素并想要更改其中一个结构中的元素。当我写入元素来更改值时,更新不会保留。以下是我有:更改结构向量中的元素

首先,在头文件:

std::vector<Sched::ScheduledEvent_t> v_SchedEvents; 
typedef std::vector<Sched::ScheduledEvent_t>::const_iterator event_iter; 

后来在一个.cpp模块...

for (event_iter i = v_SchedEvents.begin(); i != v_SchedEvents.end(); ++i) 
{ 
    ScheduledEvent_t event = *i; 

    if(event.member == true) { 
     event.member = false; 
    } 
} 

event.member了给定的值向量中的结构不会保持错误。当返回到这个循环时,条件语句再次运行。

难道它与迭代器的typedef有什么关系吗?

回答

2

这里有两个问题。

1)你正在做一个副本:

ScheduledEvent_t event = *i; 

event是向量中的元素的副本。修改event不会影响它。

2)您正在使用const_iterator,它只允许读取值而不是更改值。

使用iterator代替

typedef std::vector<Sched::ScheduledEvent_t>::iterator event_iter; 

,并直接使用它:

if (i->member) { // == true useless 
    i->member = false; 
} 

或A-范围内循环,如果你有机会到C++ 11或更近:

for (auto & event : v_SchedEvents) { 
    if (event.member) { 
     event.member = false; 
    } 
} 
0

这是一个简单的参考类型和局部变量。

当你做

ScheduledEvent_t event = *i; 

你正在创建从其中“i”是指向源一个简单的局部变量的“事件”,并复制了一切。

所以,如果你想改变的结构元素,从改变你的代码

event.member = false; 

*i.member = false; 

或(我的偏好)

i->member = false; 

我希望帮助。

+0

的引用也将解决这个问题,但是你根本没有解释,那么为什么还要提到它呢? –

+0

带括号:'(* i).member = false;' –

+0

不赞同。 '* i.member = false;'也不''(* i).member = false;'会起作用。 –

1

const_iterator可以防止修改参考值。

迭代器:行为如value_type *

常量性:行为类似const_value_type *

vector<node> v; 
v.push_back(node(10, 11)); 
for(std::vector<node>::const_iterator it = v.begin() ; it != v.end() ; ++it){ 
    node n = *it; 
    n.member = 12;   //A local copy of node `*it`. So its ok to modify. 
    n = node(10, 13);  //Okay since local Copy is not const 
    //(*it).member = 12;  //error assignment of member 'node::a' in read-only object 
    //*it = node(10, 13); //error passing 'const node' as 'this' argument discards qualifiers 
} 
for(std::vector<node>::iterator it = v.begin() ; it != v.end() ; ++it){ 
    //cout << *it.a; 
    node n = *it; 
    n.a = 12; 
    n = node(10, 13);  //No problem 
    (*it).a = 12;   //No problem 
    *it = node(10, 13); //No problem 
} 

您可以修改成员的价值,因为你得到的参考价值常量性的本地副本做ScheduledEvent_t event = *i;