为什么std :: set是一个关联容器

问题描述 投票:8回答:4

我阅读了各种文本。我唯一得到的是该集合是一个由排序的键和唯一键组成的关联容器。现在,如果没有要使用键映射的值,那么集合中的关联在哪里。

c++ stl
4个回答
6
投票

Container是用于存储其他对象并管理其所包含的对象所使用的内存的管理的对象。

AssociativeContainer是有序的容器,可基于键提供对对象的快速查找。

std::set是一个关联容器,其中包含一组排序的键类型为键的唯一对象

那么是什么使它具有关联性?集合中的元素由其键而不是在容器中的绝对位置引用的事实。当然,关键是元素本身。考虑到映射,其中键是值等于and,因为相同内容的重复副本被消除了。

那么无序集合呢?std :: unordered_set符合Container,AllocatorAwareContainer和UnorderedAssociativeContainer

的要求

1
投票

[有许多不同的思考方式,其中一些常常导致典型的鸡或蛋的困境。

例如,取std::map,根据其接口规范,它是一个简单的关联容器。但是,您可以将std::map视为(并实现)为std::set对的key:data,比较器功能仅考虑存储元素的key部分,而忽略data部分。从该角度来看,“集合”(std::setstd::unordered_set)可以被视为比“映射”(std::mapstd::unordered_map)更通用,更基础的数据结构。即“集合”的功能涵盖了存储key:data对的典型关联容器的功能。换句话说,“集合”是关联容器之父,仅出于这个原因,就可以将其视为关联容器本身。

[当然,有人可以说可以使用“地图”轻松实现“集合”(通过使用与keydata相同的值),这意味着“地图”可以看作是更多基本数据结构要比“设置”好。这就是我之前提到的鸡肉或鸡蛋的情况。


0
投票

如果您将集合本身​​视为独立的数据结构,则由于不存在映射值,因此它不适合关联数据结构的定义。但是,当集合被认为是地图的特例时,映射(“关联”)值与键相同,则适合将其称为关联容器。请注意,映射比集合更被认为是主要数据结构,因为一个人可以使用映射来实现一个集合,反之亦然。


0
投票

我们可以假设有两种类型的容器,一种是链接列表,另一种是关联容器。我们可以通过一个键来选择任何关联容器的值,例如,在一个简单的数组中,您可以通过其位置来选择任何值,即arr [position] = value。在这里,位置是关键。但是,您不能对链接列表执行此操作。

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