我想更改集合(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
是可以的少数几种情况之一。
但是,惯用的方法是使用提示插入:
QSet
)例子:
s.erase(original);
// modify p ...
s.insert(copy, hint);
注意事项:
std::vector
视为替代品是一个好主意std::set
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句