【问题标题】:Changing an element within a vector of structures更改结构向量中的元素
【发布时间】:2016-11-06 03:49:29
【问题描述】:

我正在遍历结构向量中的一组元素,并希望更改其中一个结构中的元素。当我写入元素以更改值时,不会保留更新。这是我所拥有的:

首先,在头文件中:

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

【问题讨论】:

    标签: c++ vector copy const-correctness const-iterator


    【解决方案1】:

    这里有两个问题。

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      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 引用值的本地副本

      【讨论】:

        【解决方案3】:

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

        当你这样做时

        ScheduledEvent_t event = *i;
        

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

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

        event.member = false;
        

        *i.member = false;
        

        或(我的偏好)

        i->member = false;
        

        希望对你有帮助。

        【讨论】:

        • 引用也可以解决问题,但你根本没有解释,为什么还要提到它?
        • 带括号:(*i).member = false;
        • 不同意。 *i.member = false;(*i).member = false; 都不起作用。
        • 你是对的。我错过了。谢谢大家指出这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        相关资源
        最近更新 更多