如何修改QSet的元素

How to modify elements of a QSet?

本文关键字:QSet 元素 修改 何修改      更新时间:2023-10-16

我有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 &value) {_coordinate = value;}

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

我相信你不能这样修改你的set的项,所以没有这样的API。您所需要修改的所有项只是清除集合并再次插入新项。

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