C++ 一种地图

C++ 一种地图,c++,algorithm,C++,Algorithm,我有一个映射(例如,从字符到整数)。我将一个接一个的值插入到这个映射中。例如,这里有四个插入: 1: A -> 1 2: B -> 2 3: C -> 3 4: D -> 1 我想根据映射键的关联值对其进行排序。因此,在每次插入时,我将得到排序后的输出: 1: A(1) 2: B(2), A(1) 3: C(3), B(2), A(1) 4: C(3), B(2), A(1), D(1) 此外,我希望能够覆盖现有映射以保持键(字符)的唯一性。第五个插入: 5: A -

我有一个映射(例如,从字符到整数)。我将一个接一个的值插入到这个映射中。例如,这里有四个插入:

1: A -> 1
2: B -> 2
3: C -> 3
4: D -> 1
我想根据映射键的关联值对其进行排序。因此,在每次插入时,我将得到排序后的输出:

1: A(1)
2: B(2), A(1)
3: C(3), B(2), A(1)
4: C(3), B(2), A(1), D(1)
此外,我希望能够覆盖现有映射以保持键(字符)的唯一性。第五个插入:

5: A -> 27
将导致排序后的输出为:

5: A(27), C(3), B(2), D(1)
一种方法是使用多重贴图。多重映射的键是整数,值是字符。每次插入多重贴图时,首先需要检查角色是否已存在于多重贴图中,并在执行插入之前删除该贴图。多重映射使键保持有序,以便进行排序

有没有更快的方法?我是否应该使用另一种更高效的容器

编辑

这是我正在使用的。它很方便,因为它保留了元素


这是一个例子。我试图避免执行公认的解决方案中建议的操作:创建另一个映射。

通常,映射是一个无序的数据结构(至少对于关联的值而言)。 因此,对地图的元素进行排序是毫无意义的

因此,您应该使用类似列表或数组的东西来保持元素的排序

我认为解决您的问题的最佳方法是最简单的方法:将元素存储在列表中并进行排序。或者可以使用堆

更新:

贴图是一种关联容器,用于存储形成的元素 通过键值和映射值的组合

在映射中,键值通常用于唯一标识 元素,而映射值是与 这把钥匙。键和映射值的类型可能不同。例如,一个 地图的典型示例是电话指南,其中名称为 键,电话号码是映射的值

在内部,地图中的元素从低到高排序 上设置的特定严格弱排序标准之后的键值 建筑

作为关联容器,它们特别设计为 通过其键高效地访问其元素(与序列不同 容器,通过它们的 相对或绝对位置)[]


地图按其键和定义进行排序

这些值不能在映射的排序谓词中使用,因为这些值是非常量!更改它们将使容器不变量(排序)无效

如果您希望条目按“value”排序,那么它隐式地是一个键,并且您可能需要一个

std::set<std::pair<key, value> >

插入直接插入到有序的位置。您可以期望push_heap对于许多插入会更快,而
lowerbound
/
insert
对于许多访问会更快。想象你的地图将
x
映射到
y
。我会创建一个结构(类,无论什么):

struct元素
{
将此映射到x;
为了这一点;
布尔运算符<(元素和右侧)
{
返回y
然后创建一个
集合
并插入其中。如果对集合中的所有数据进行迭代,则可以按所需顺序获得数据。插入时,首先搜索并查看值为所需值的
x
元素是否存在。如果是这样,只需更新
y
,否则插入一个新元素。

只需使用
映射
,您的键将保持唯一,一对
将存储在其中


要根据元素的关联值对元素进行排序,还需要将
pair
存储在一个集合中。

这是一个令人困惑的解释。地图通常是有序的,而不是无序的。排序元素不是有意义的,而是多余的。@Masoud M。在一般情况下,您可能是对的。然而,C++ STL MultIMAP是内部排序的。我对我的问题进行了编辑,使其更加明显。列表解决方案效率太低,因为每次插入后我都必须进行排序,并且没有有效的方法保持键的唯一性。当我们实现map
yes
时,我们应该按顺序存储键。但它对地图用户来说是透明的。@misha:添加了一些特定的提示来保持列表的有序性inserting@misha,每次插入到
列表时,您不需要使用它,您可以迭代列表并将其插入到正确的位置,因此它实际上是
O(n)
他希望映射从
char
int
,但是根据
int
@misha排序的数据:寻找插入点(使用
下限
)是O(logn),因为采用了二进制搜索。所以保持它的有序性,它在任何情况下都不是二次的。请注意std::set示例,它将项目保存在Btree中(在大多数实现中),就像std::map一样,您将如何执行“搜索并查看”步骤?集合是基于
y
排序的,您要查找
x
的特定值。我可以使用地图来处理这个问题,但它最终会比我原来的多地图方法慢。此外,不可能简单地更新
y
,因为它
const
——更改它将使元素在集合中的位置无效。删除和重新插入似乎是必要的,这会花费额外的时间。你是对的。更新它意味着删除并重新插入,这将分别占用
O(log n)
。要搜索,您可以线性搜索(
O(n)
),或者在将
x
映射到
y
的一侧有一个映射,通过该映射,您可以识别与
x
对应的
y
,并从集合中删除(x,y)和插入(x,newy)(每个步骤都是
O(logn)
insert_point = std::lower_bound(lst.begin(), lst.end(), insertee);
st.insert(insertion_point, insertee);
struct element
{
    map_this_t x;
    to_this_t  y;
    bool operator < (element &rhs)
    {
        return y < rhs.y;       // sorted based on y
    }
};