修改`std :: set`中用户定义类型的值

问题描述 投票:1回答:1

考虑一下我有一个用户定义的类型,比如说一个id()成员函数返回唯一的std::string

[我想要这个对象的容器,其中id()唯一地标识元素,但是我想“使用”这些对象来做可能会修改其成员的其他事情。

我目前正在通过调用std::set::emplace并捕获返回的迭代器布尔对来构造对象。

但是由于迭代器是常量,所以我不允许修改它的值。

有没有做我想要的好方法?我能想到的只有两个:

  1. unique_ptr存储到set中的对象,通过这种方式,指针值是区别于指针的值,而不是名称,可以修改指向的对象。
  2. 使用map作为密钥存储id(),但这意味着我已经复制了密钥。

[如果为我的问题提供了合适的容器,我很乐意使用Boost等经过广泛采用的现代图书馆。

c++ stl c++17 c++20 stdset
1个回答
0
投票

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元素的数据成员,则顺序不会中断。

© www.soinside.com 2019 - 2024. All rights reserved.