2016-11-06 2 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; 
} 

Или в для диапазона цикла, если у вас есть доступ к C++ 11 или более поздние:

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

Это простой тип ссылочного типа и локальной переменной.

Когда Вы делаете

ScheduledEvent_t event = *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_iterator: Ведет себя как 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 
} 

Вы можете изменить значение члена, потому что вы получаете локальную копию const_iterator эталонное значение, делая ScheduledEvent_t event = *i;

Смежные вопросы