考虑一下我有一个用户定义的类型,比如说一个id()
成员函数返回唯一的std::string
。
[我想要这个对象的容器,其中id()
唯一地标识元素,但是我想“使用”这些对象来做可能会修改其成员的其他事情。
我目前正在通过调用std::set::emplace
并捕获返回的迭代器布尔对来构造对象。
但是由于迭代器是常量,所以我不允许修改它的值。
有没有做我想要的好方法?我能想到的只有两个:
unique_ptr
存储到set
中的对象,通过这种方式,指针值是区别于指针的值,而不是名称,可以修改指向的对象。map
作为密钥存储id()
,但这意味着我已经复制了密钥。[如果为我的问题提供了合适的容器,我很乐意使用Boost等经过广泛采用的现代图书馆。
std::set
]保持其元素的排序,并且keys元素被排序,与元素本身相对应。结果,std::set
中的元素是const
合格的,以防止用户修改元素(即,键)并因此破坏顺序。
[传统上,如果要修改std::set
的元素,则必须首先从std::set
中删除要修改的元素对象,对其进行修改,然后将其再次插入std::set
。问题是,这导致std::set
内部节点的分配。
std::set::extract()
分配自C ++ 17起,由于std::set
,您可以在不分配std::set
内部节点的情况下将元素删除并重新插入到std::set::extract()
中。
这些方法的缺点-无论是否进行分配-将元素重新插入到std::set::extract()
中都需要集合大小的对数时间。
std::set
元素只要您std::set
的比较功能未考虑您更改的数据成员,您仍然可以将const
转换为std::set
的元素并修改其数据成员。也就是说,如果仅修改不考虑比较功能的std::set
元素的数据成员,则顺序不会中断。