QHash QList容器类修改元素的值

全部修改

直接通过迭代就可以修改:

    struct LinkageAxis_t{
    uint32_t x;
    uint32_t y;
    uint32_t z;
    };
    
    QHash<int,LinkageAxis_t> hash;

    hash.insert(0,{00,01,02});
    hash.insert(1,{10,11,12});
    hash.insert(2,{20,21,22});

    for(auto &val : hash){
        qDebug("val:%d",val.x);
        val.x += 100;
    }

    for(auto &val : hash){
        qDebug("val2:%d",val.x);
    }

但是,QHash直接获取元素后是不能修改的:

auto &val = hash.value(0);

val.x += 100;

以及:

QList<LinkageAxis_t> list;

list.append({00,01,02});
list.append({10,11,12});
list.append({20,21,22});

auto &lval = list.value(0);

都是错误的。

还有种方法,就是通过迭代器来修改:

QHash<int,LinkageAxis_t>::iterator it;

for (it = hash.begin(); it != hash.end(); ++it)
    it.value().x += 2;

没想到吧,但上面的方法是要进入循环,不能单个修改。这样修改单个会出现时间浪费的问题。

单个修改

单个的只能使用括号重载符了:

list[0].x = 2,或者

hash[1].x = 2

不过要判断这个元素是否有效,特别是指针元素的情况下!

还有种方法:

  // 通过迭代器查找,找到以后返回引用,然后直接改,有点像迭代器循环修改,不过这是单个的
  QHash<QString, int> hash;
  ...
  QHash<QString, int>::iterator i = hash.find("HDR");
  if(i != hash.end() && i.key() == "HDR") {
      i.value() = NewValue;
  }

如果有重复的key,可以搞个while来一直迭代,不过我们最好不要用重复的key。

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com