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 有什么关系吗?

4

3 回答 3

4

这里有两个问题。

1)您正在制作副本:

ScheduledEvent_t event = *i;

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

2)您使用的 aconst_iterator只允许读取值,而不是更改它。

改用iteratora

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防止修改引用的值。

迭代器:行为类似于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 回答
0

这是引用类型和局部变量的简单问题。

当你这样做

ScheduledEvent_t event = *i;

您正在创建一个简单的局部变量“event”并从“i”指向的源复制所有内容。

因此,如果您希望更改结构中的元素,请更改您的代码

event.member = false;

*i.member = false;

或(我的偏好)

i->member = false;

我希望这会有所帮助。

于 2016-11-06T03:57:17.537 回答