【发布时间】:2020-02-10 17:26:52
【问题描述】:
考虑我有一个用户定义类型的情况,其中有一个 id() 成员函数,它返回一个唯一的 std::string。
我想要一个包含这些对象的容器,其中 id() 唯一标识元素,但我想“使用”这些对象来做其他可能修改其成员的事情。
我目前正在构造对象。通过调用std::set::emplace 并捕获返回的迭代器,布尔对。
但是我不能修改它的值,因为迭代器是 const。
有什么好方法可以做我想做的事吗?我能想到的只有两个:
- 将
unique_ptrs 存储到set中的对象中,这样区分它的是指针值而不是名称,并且可以修改指向的对象。 - 使用
id()作为密钥存储map,但这意味着我复制了密钥。
如果它们有合适的容器来解决我的问题,我很乐意使用被广泛采用的现代库,例如 boost。
【问题讨论】:
-
您是否使用
set来确保容器中只有唯一的对象? -
@NathanOliver 是的,并且还提供基于密钥的 sub O(n) 查找时间。我对
std::unordered_set也有同样的问题 -
如果您注意不影响严格的弱排序,您可能能够摆脱可变类成员和 const 类方法。这将是相当丑陋的,但它会工作。
unordered_set也是如此,只要哈希值不受影响。 -
@SamVarshavchik 这绝对不理想,因为我使用 const 来影响类型的真正目的。我认为指针路线将是我最好的选择。
-
您是否考虑过使用
.extract成员函数从集合中删除所需的项目,对其进行修改,然后将其放回?这避免了与“正常”插入相关的所有分配。
标签: c++ stl c++17 c++20 stdset