通过迭代器修改集合中的元素
Change element in a set via iterator
我想更改集合(QSet)中的一个元素:
for(PSet::iterator pIt = P.begin(); pIt != P.end(); ++pIt)
pIt->xp = 0;
编译器不允许我这样做("C3892: 'var':你不能给const变量赋值")。由于担心改变元素可能会破坏其在集合中的正确位置,set迭代器似乎总是常数。
在我的例子中,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;
};
哈希函数不考虑非const成员xp,所以上面的赋值对于元素在集合中的顺序应该是完全安全的。我不想删除元素并重新插入它,因为性能实际上是这里的一个问题。
我想我可以使用const-cast,但这会损害我的代码的可读性,看起来像一个讨厌的hack。我还有别的选择吗?
不允许修改QSet
元素,因为修改其中一个哈希结果可能会破坏容器的内部结构。
对于标准的关联容器,在标准节§23.2.4
关联容器的迭代器是双向迭代器类别。对于值类型相同的关联容器作为键类型,iterator和const_iterator都是常量迭代器。是否迭代器和是未指定的Const_iterator是相同的类型。
如果您知道您的修改对排序位置元素没有影响,则使用const_cast
是少数可以使用的情况之一。
- 找到要修改的元素
- 复制元素
- 修改副本
- 删除元素
- 插入副本,在可用时使用提示插入(
QSet
没有)
例子:
s.erase(original);
// modify p ...
s.insert(copy, hint);
指出:
- 同样适用于其他关联容器。
- 这个问题在Scott Meyers的"Effective STL, Item 22"中有广泛的讨论。
- 有时考虑
std::vector
作为std::set
的替代品是一个好主意
set
的元素不能重复。如果允许更改元素,那么就不需要维护所有这些逻辑。因此,您需要擦除现有元素并插入新元素。
所以除非你使用const_cast
,否则没有其他方法可以做到这一点。然而,如前所述,这样做可能会破坏set
,允许它具有潜在的重复值。
这是如何做一个std::set<int>
(我知道它不是一个QT集,但逻辑应该是相同的):
std::set<int> mySet;
mySet.insert(3);
mySet.insert(4);
for (auto i = mySet.begin(); i != mySet.end(); i++)
{
int* elem = const_cast<int*>(&*i);
*elem = 6;
}
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- c++找不到具有相同哈希的无序集合元素
- 从C++无序集合中高效提取元素
- 如何在比较时更改集合元素的值(在 c++ 中)?
- 打印无序映射的第二个元素,即集合
- 在集合中查找使用结构C++的元素
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 消除集合的第一个元素
- 将集合的随机元素添加到列表中,然后将其从原始集合中移除
- 将字符串集合中的元素添加到字符串集合的向量中
- 如何从一个无序集合中获取一个元素
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- C++ 如何以特定模式遍历矢量的不同集合元素
- 生成所有可能的元素选择,每个元素都来自不同的集合
- 我们如何使用下面的集合构造函数构造设置元素
- 我可以在一行代码中将向量中与条件匹配的所有元素插入到集合中吗?
- 是否可以在C STL中获得集合的单个元素
- 如何替换集合中的元素
- 使用常量键从集合中擦除元素
- 访问双元素集合中的另一个元素的简洁语法是什么?