通过迭代器更改集合中的元素

我想更改集合(QSet)中的元素:

for(PSet::iterator pIt = P.begin(); pIt != P.end(); ++pIt)
  pIt->xp = 0;

编译器不允许我这样做(“ C3892:'var':您无法分配给常量const”)。由于担心更改元素可能会破坏其在集合中的正确位置,因此集合迭代器似乎总是恒定不变的。

在我的情况下,PSet是一组结构,我为其定义了自己的哈希函数:

struct P
{
  P(int id, const Data_t& data)
     :xp(_INFINITY_)
     ,id(id)
     ,data(data){}

  int xp;  
  const int id;
  const Data_t data;
};

我的哈希函数不考虑非常量成员xp,因此,关于集合中元素的顺序,我上面的分配应该是绝对安全的。我不想删除该元素并重新插入它,因为性能实际上是这里的问题。

我想我可以使用const-cast,但这会损害代码的可读性,看起来像是讨厌的骇客。我还有其他选择吗?

量子开发

QSet不允许修改元素,因为它可能会通过修改哈希结果之一来破坏容器的内部结构。

对于标准的关联容器,在标准部分的第23.2.4节中

关联容器的迭代器属于双向迭代器类别。对于值类型与键类型相同的关联容器,iterator和const_iterator均为常量迭代器。不确定iterator和const_iterator是否为同一类型。

如果您知道修改对排序后的位置元素没有影响,则使用aconst_cast是可以的少数几种情况之一。

但是,惯用的方法是使用提示插入

  1. 找到要修改的元素
  2. 复制元素
  3. 修改副本
  4. 删除元素
  5. 插入副本,并在可用时使用提示插入(不存在QSet

例子:

  s.erase(original);
  // modify p ...
  s.insert(copy, hint);

注意事项:

  1. 其他关联容器也是如此。
  2. 该问题在Scott Meyers的有效STL,项目22 ”中进行了广泛讨论
  3. 有时考虑将其std::vector视为替代品是一个好主意std::set

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章