我发现std::set
上的更新操作很乏味,因为cppreference上没有这样的API。所以我现在做的事情是这样的:
//find element in set by iterator
Element copy = *iterator;
... // update member value on copy, varies
Set.erase(iterator);
Set.insert(copy);
基本上,Set
返回的迭代器是一个const_iterator
,您不能直接更改它的值。
有没有更好的方法来做这件事?或者我应该通过创建自己的代码来覆盖std::set
(我不知道它到底是如何工作的。)
发布于 2010-02-08 03:04:38
set
返回const_iterators
(标准说明set<T>::iterator
是const
,set<T>::const_iterator
和set<T>::iterator
实际上可能是同一类型-请参阅n3000.pdf中的23.2.4/6 ),因为它是一个有序容器。如果它返回一个常规的iterator
,你将被允许改变容器下的items值,这可能会改变排序。
您的解决方案是在set
中更改项的惯用方法。
发布于 2018-09-22 21:54:06
在C++17中,使用extract()
可以做得更好,这要归功于P0083
// remove element from the set, but without needing
// to copy it or deallocate it
auto node = Set.extract(iterator);
// make changes to the value in place
node.value() = 42;
// reinsert it into the set, but again without needing
// to copy or allocate
Set.insert(std::move(node));
这将避免额外的类型副本和额外的分配/释放,并且也适用于仅移动类型。
您也可以按键执行extract
。如果没有key,这将返回一个空节点:
auto node = Set.extract(key);
if (node) // alternatively, !node.empty()
{
node.value() = 42;
Set.insert(std::move(node));
}
发布于 2010-02-08 03:17:24
您可能希望改用std::map
。使用影响键排序的Element
部分,并将Element
的所有内容作为值。将会有一些次要的数据重复,但您会有更容易(可能更快)的更新。
https://stackoverflow.com/questions/2217878
复制相似问题