如何在不使用“可变”或“const_cast”的情况下编辑 std::set 中的元素,并且无需擦除和再次插入?

How to edit an element in std::set without using 'mutable' or 'const_cast', and without erasing and inserting again?

提问人:StackExchange123 提问时间:2/13/2020 更新时间:2/13/2020 访问量:265

问:

假设我有一个名为“ClientInfo”的结构,这个结构包含一些关于某个clinet的信息。假设每个客户端都有一个固定的 ID 和一些可以更改的其他信息,例如“地址”或“余额”。 如果我想将客户端信息存储在某个为我提供 log(n) 插入/删除的容器中,那么我认为 std::set 是最合适的。但是不幸的是,即使修改不会影响订单(我认为),设置也不允许修改其中的任何项目。我在互联网上寻找解决方案,我找到的只是以下之一:

  1. 使用“可变”
  2. 使用const_cast
  3. 您可以擦除并再次插入 (O(1))
  4. 您可以使用 std::map

--

1/2 - 我认为我不会使用前两个选项,因为我不想弄乱程序的常数正确性。

3 - 另外,我认为即使擦除和插入是 O(1),我认为如果我可以修改元素,那会更快。

4 - 我也不认为 std::map 是正确的选择,因为我想访问客户的 ID。如果我使用 std::map,我有两个选择:

  1. 复制 ID 两次,一次用于映射的键,一次用于结构体内部。
  2. 从结构中删除 ID 以避免重复,但在这种情况下,我将无法直接访问结构中客户端的 ID。

很明显,我不想复制 ID,因为它的复制成本可能很高,例如 std::string 或某些对象。

--

所以我的问题是:如何在不使用“可变”或“const_cast”的情况下直接修改 std::set 中的元素,而无需再次擦除和插入,而无需使用 std::map?如何告诉 std::set ID 是常量的,并且它是唯一影响元素顺序的东西,并告诉它允许修改 ID 以外的任何其他内容?

C++(英语:C++) 常数 标准地图 可变 标准设置

评论

0赞 Tobias Ribizel 2/13/2020
如果您不介意额外的间接层,您可以存储元素并使用自定义比较器。据我所知,unique_ptr不会传播恒常性。或者,如果您仍然需要快速比较而没有间接比较,您可以存储一个std::unique_ptrstd::pair<ClientID, std::unique_ptr<ClientInfo>>
0赞 StackExchange123 2/13/2020
感谢您的评论!解决方案很棒,但我不知道为什么我必须使用某种解决方法来使其工作。为什么我不能告诉它,如果其他成员不打算成为比较的一部分,那么编辑它们就没有问题了?我认为这将是最快和最简单的方法,无需任何解决方法。
0赞 Sigi 2/13/2020
恕我直言,4.1 是要走:)路

答: 暂无答案