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