提问人:StackExchange123 提问时间:2/13/2020 更新时间:2/13/2020 访问量:265
如何在不使用“可变”或“const_cast”的情况下编辑 std::set 中的元素,并且无需擦除和再次插入?
How to edit an element in std::set without using 'mutable' or 'const_cast', and without erasing and inserting again?
问:
假设我有一个名为“ClientInfo”的结构,这个结构包含一些关于某个clinet的信息。假设每个客户端都有一个固定的 ID 和一些可以更改的其他信息,例如“地址”或“余额”。 如果我想将客户端信息存储在某个为我提供 log(n) 插入/删除的容器中,那么我认为 std::set 是最合适的。但是不幸的是,即使修改不会影响订单(我认为),设置也不允许修改其中的任何项目。我在互联网上寻找解决方案,我找到的只是以下之一:
- 使用“可变”
- 使用const_cast
- 您可以擦除并再次插入 (O(1))
- 您可以使用 std::map
--
1/2 - 我认为我不会使用前两个选项,因为我不想弄乱程序的常数正确性。
3 - 另外,我认为即使擦除和插入是 O(1),我认为如果我可以修改元素,那会更快。
4 - 我也不认为 std::map 是正确的选择,因为我想访问客户的 ID。如果我使用 std::map,我有两个选择:
- 复制 ID 两次,一次用于映射的键,一次用于结构体内部。
- 从结构中删除 ID 以避免重复,但在这种情况下,我将无法直接访问结构中客户端的 ID。
很明显,我不想复制 ID,因为它的复制成本可能很高,例如 std::string 或某些对象。
--
所以我的问题是:如何在不使用“可变”或“const_cast”的情况下直接修改 std::set 中的元素,而无需再次擦除和插入,而无需使用 std::map?如何告诉 std::set ID 是常量的,并且它是唯一影响元素顺序的东西,并告诉它允许修改 ID 以外的任何其他内容?
答: 暂无答案
评论
std::unique_ptr
std::pair<ClientID, std::unique_ptr<ClientInfo>>