set和map区别

set和map区别

1.set
(1)set 类似于数组,成员唯一且有序的数据结构,没有键名.

const s = new Set(['a', 'b', 'c'])
console.log(s.keys()) // 键的集合
console.log(s.values()) // 值的集合
console.log(s.entries()) // 键值对的结合

(2)具有 size 属性可以遍历,遍历方法有 keys、values、entries、forEach,其他方法有:add、delete、has、clear。
2. map
(1)map类似于对象,和对象不同的时对象本身也可以当作键名。
(2)具有size属性可以遍历,遍历对象有keys、values、entries、foreach,其他方法有 get、set、has、delete、clear 等,可以跟各种数据格式进行转换。

<think>我们正在讨论C++中setmap区别。根据引用内容,我们知道setmap都是关联容器,但它们有不同的用途特性。 引用[1]指出:set用于存储唯一且排序的元素,map用于存储键值对并根据键排序。 引用[2]提到它们都有排序去重的特性(对于setmap(键唯一))。 引用[3][4]提供了一些细节,尤其是mapset的底层实现与pair有关(map存储pair<key, value>,set只存储key,但底层实现上,set的value就是key,即pair<key, key>,但对外表现为一个集合)。 因此,我们可以从以下几个方面来比较setmap: 1. 存储内容:set只存储键(key),而map存储键值对(key-value)。 2. 元素唯一性:set中元素唯一;map中键(key)唯一,值(value)可以重复。 3. 排序:两者都是有序容器(默认升序),但set根据元素本身排序,map根据键排序。 4. 底层实现:通常都是红黑树,因此插入、删除、查找的时间复杂度都是O(log n)。 5. 功能:map支持通过键直接访问值(使用[]运算符),set则没有键值对的概念,只有元素。 6. 应用场景:set用于需要自动排序去重的集合;map用于需要建立键到值映射的情况。 下面展开详细说明。 </think>### C++中`set`与`map`的区别详解 在C++ STL中,`set``map`都是基于红黑树实现的**有序关联容器**,但两者在数据存储、访问方式应用场景上有显著差异。以下是核心区别分析(基于引用[1][3][4]): --- #### 一、**存储结构差异** | 容器 | 存储内容 | 底层实现 | |------|------------------------------|---------------------------| | `set` | **单一键值(Key)** | 存储`pair<Key, Key>`,对外表现为单元素集合[^4] | | `map` | **键值对(Key-Value)** | 存储`pair<const Key, Value>`[^3] | **示例代码**: ```cpp #include <iostream> #include <set> #include <map> using namespace std; int main() { // set: 存储单一键值 set<int> numSet = {5, 2, 8, 2}; // 存储结果: {2,5,8}(去重+排序) // map: 存储键值对 map<string, int> studentScores = { {"Alice", 90}, {"Bob", 85} }; // 键为string,值为int } ``` --- #### 二、**元素访问方式** | 容器 | 访问方式 | 特点 | |--------|-----------------------------------|------| | `set` | 通过迭代器遍历(无直接键访问) | 仅支持`find()`、`count()`等查找方法[^3] | | `map` | 支持`[key]`或`at(key)`直接访问值 | 若键不存在,`[]`会自动插入新键(值默认初始化)[^3] | **代码对比**: ```cpp // set访问 auto it = numSet.find(5); // 返回迭代器,需解引用:*it → 5 // map访问 cout << studentScores["Alice"]; // 直接输出90 studentScores["Charlie"] = 75; // 自动插入新键值对 ``` --- #### 三、**功能与特性对比** | 特性 | `set` | `map` | |--------------------|----------------------------------|----------------------------------| | **元素唯一性** | 所有元素唯一(自动去重) | 键(Key)唯一,值(Value)可重复 | | **排序依据** | 按Key排序 | 按Key排序 | | **插入操作** | `insert(key)` | `insert({key, value})`或`emplace` | | **典型应用场景** | 去重集合、交集/并集运算[^2] | 词典、缓存、数据映射[^1] | **示例场景**: 1. **`set`去重计数**: ```cpp vector<int> nums = {1,2,2,3,3,3}; set<int> uniqueNums(nums.begin(), nums.end()); cout << uniqueNums.size(); // 输出3(去重后元素数)[^2] ``` 2. **`map`词频统计**: ```cpp map<string, int> wordCount; for (auto &word : words) wordCount[word]++; // 直接统计频率[^1] ``` --- #### 四、**底层实现关联** - **共同点**: 二者均基于**红黑树**(自平衡二叉搜索树),因此: - 插入/删除/查找时间复杂度:$O(\log n)$ - 元素自动按Key升序排列(可通过比较器修改)[^3] - **差异点**: `set`的底层是`pair<Key, Key>`(Value=Key),而`map`是`pair<const Key, Value>`[^4]。 --- #### 五、**衍生容器:`multiset`与`multimap`** | 容器 | 特点 | |---------------|-------------------------------| | `multiset` | 允许重复元素(不去重) | | `multimap` | 允许重复键(一键多值) | --- #### 六、**总结与选择建议** | 场景 | 推荐容器 | 原因 | |--------------------------|----------|------| | 需要存储唯一键 | `set` | 自动去重且有序[^1] | | 需建立键到值的映射 | `map` | 支持键值对直接访问[^3] | | 允许重复元素 | `multiset` | 不去重集合 | | 一键对应多个值(如索引) | `multimap` | 键可重复 | > **核心区别公式**: > $$\text{set}: \text{Key-Only} \quad \text{map}: \text{Key} \rightarrow \text{Value}$$ --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值