1

構造体のベクトル内の一連の要素を反復処理しており、構造体の 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 の値が false のままではありません。このループに戻ると、条件ステートメントが再度実行されます。

イテレータの typedef と何か関係があるのでしょうか?

4

3 に答える 3

4

ここで 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-range ループ:

for (auto & event : v_SchedEvents) {
    if (event.member) {
        event.member = false;
    }
}
于 2016-11-06T04:11:54.730 に答える
1

参照された値のconst_iterator変更を防ぎます。

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;

于 2016-11-06T04:11:58.593 に答える