C++ 如何在std::set中编辑元素而不使用';可变的';或';const#u cast';,而不需要再次擦除和插入?

C++ 如何在std::set中编辑元素而不使用';可变的';或';const#u cast';,而不需要再次擦除和插入?,c++,constants,stdmap,mutable,stdset,C++,Constants,Stdmap,Mutable,Stdset,假设我有一个名为“ClientInfo”的结构,这个结构包含一些关于clinet的信息。假设每个客户机都有一个常量ID和一些可以更改的其他信息,如“地址”或“余额”。 如果我想将客户机信息存储在某个容器中,以便插入/删除日志(n),那么我认为std::set是最合适的。但不幸的是,set不允许修改其中的任何项目,即使修改不会影响订单(我认为)。我在互联网上寻找解决方案,我只找到以下一个: 使用“可变” 使用const_cast 您可以删除并再次插入(O(1)) 您可以使用std::map --

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

  • 使用“可变”
  • 使用const_cast
  • 您可以删除并再次插入(O(1))
  • 您可以使用std::map
  • --

    1/2-我不认为我会使用前两个选项,因为我不想干扰我程序的常量正确性

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

    4-另外,我不认为std::map是正确的解决方案,因为我想访问客户端ID。如果我使用std::map,我有两个选择:

  • 复制ID两次,一次用于映射的键,一次用于结构内部
  • 从结构中删除ID以避免重复,但在本例中,我无法直接访问结构中的客户端ID
  • 很明显,我不想复制ID,因为复制它可能会很昂贵,例如std::string或某个对象

    --


    所以我的问题是:如何直接修改std::set中的元素,而不使用“可变”或“常量转换”,不删除和再次插入,也不使用std::map?如何告诉std::set ID是常量,它是唯一影响元素顺序的东西,并告诉它允许修改除ID以外的任何内容?

    如果不介意附加间接层,可以存储
    std::unique\u ptr
    元素并使用自定义比较器。据我所知,unique_ptr不会传播常数。或者,如果您仍然需要快速比较而无需间接操作,您可以存储一个
    std::pair
    ,谢谢您的评论!这个解决方案很好,但我不知道为什么我必须使用某种变通方法才能使它起作用。为什么我不能告诉它,如果其他成员不参与比较,那么编辑它们就没有问题了?我认为这是最快、最简单的方法,无需任何变通。IMHO,4.1是最好的方法:)如果您不介意额外的间接层,您可以存储
    std::unique_ptr
    s元素并使用自定义比较器。据我所知,unique_ptr不会传播常数。或者,如果您仍然需要快速比较而无需间接操作,您可以存储一个
    std::pair
    ,谢谢您的评论!这个解决方案很好,但我不知道为什么我必须使用某种变通方法才能使它起作用。为什么我不能告诉它,如果其他成员不参与比较,那么编辑它们就没有问题了?我认为这将是最快、最简单的方法,无需任何变通。IMHO,4.1是最好的方法:)