更改结构向量中的元素
Changing an element within a vector of structures
我正在遍历结构向量中的一组元素,并想更改其中一个结构中的元素。当我写入元素以更改值时,不会保留更新。这是我所拥有的:
首先,在头文件中:
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 有什么关系吗?
引用类型和局部变量的简单问题
当你这样做时
ScheduledEvent_t event = *i;
您正在创建一个简单的局部变量 "event" 并从 "i" 指向的源中复制所有内容。
因此,如果您希望更改结构中的元素,请更改您的代码
event.member = false;
到
*i.member = false;
或(我的偏好)
i->member = false;
希望对您有所帮助。
这里有两个问题。
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;
}
}
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
}
您可以修改成员值,因为您正在通过执行 ScheduledEvent_t event = *i;
获取 const_iterator 引用值的本地副本
我正在遍历结构向量中的一组元素,并想更改其中一个结构中的元素。当我写入元素以更改值时,不会保留更新。这是我所拥有的:
首先,在头文件中:
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 有什么关系吗?
引用类型和局部变量的简单问题
当你这样做时
ScheduledEvent_t event = *i;
您正在创建一个简单的局部变量 "event" 并从 "i" 指向的源中复制所有内容。
因此,如果您希望更改结构中的元素,请更改您的代码
event.member = false;
到
*i.member = false;
或(我的偏好)
i->member = false;
希望对您有所帮助。
这里有两个问题。
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;
}
}
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
}
您可以修改成员值,因为您正在通过执行 ScheduledEvent_t event = *i;