如何修改QSet的元素?

时间:2014-06-27 09:07:32

标签: c++ qt qset

我有QSet<QuadPattern> texture;,我想在循环中修改所有QuadPattern。

foreach不是一个好的解决方案,因为它会复制。

使用此代码:

QMutableSetIterator<QuadPattern>  it(texture);
while (it.hasNext())
{
    it.next();
    it.value().setCoordinate(...));
}

我收到编译错误:

error: C2662: 'QuadPattern::setCoordinate' : cannot convert 'this' pointer from 'const QuadPattern' to 'QuadPattern &'
Conversion loses qualifiers

函数setCoordinate是这样的:

  

inline void setCoordinate(const std :: pair&amp; value){_ unsordinate = value; }

为什么会出现此错误?

2 个答案:

答案 0 :(得分:5)

错误是因为您尝试修改QMutableSetIterator::value()函数返回的 const 对象。

我相信你不能以这种方式修改你的套装,因此没有这样的API。修改所有项目所需的只需清除集合并再次插入新项目。

答案 1 :(得分:0)

QMutableSetIterator::value()有一个很好的理由来返回一个const引用。集合中的项目根据其哈希值在内部编制索引。如果您想要更改项目,通常需要删除并重新插入该项目。如果您希望避免复制数据,请将QuadPattern隐式共享类:

class QuadPatternData : public QSharedData
{
   ...
};

class QuadPattern {
  QSharedDataPointer<QuadPatternData> d;
public:
  QuadPattern() : d(new QuadPatternData) {}
  QuadPattern(const QuadPattern & other) : d(other.d) {}
  QuadPattern(QuadPattern && other) { d.swap(other.d); }
  void setCoordinate( ... ) { d->coordinate = ...; }
  ...
};