map跟set的区别和共性

在 JavaScript 中,MapSet 是两个用于存储数据的集合类型,它们在用途和行为上有一些重要的区别和共性。

共同点

  1. 都保持插入顺序:

    • MapSet 都维护了元素的插入顺序。你可以使用 forEachfor...of 迭代它们时,会按照插入的顺序访问元素。
  2. 都是 ES6 引入的:

    • 两者都是 ECMAScript 6(ES6)引入的新数据结构,提供了更灵活和强大的数据存储和操作功能。
  3. 支持迭代:

    • 两者都支持使用 forEachfor...of 等方法进行迭代操作。
  4. 不允许重复元素:

    • Set 确保集合中所有的元素都是唯一的。
    • Map 的键(key)必须唯一,但值(value)可以重复。

区别

  1. 数据结构的目的:

    • Map:用于存储键值对(key-value pairs)。每个元素都有一个唯一的键(key)和一个值(value)。Map 的键可以是任何类型(包括对象和函数),并且键值对的顺序是插入顺序。
    • Set:用于存储唯一的值。集合中的每个元素都是唯一的,不允许重复。Set 只存储值,没有键。
  2. 主要操作:

    • Map

      • 添加map.set(key, value)
      • 获取map.get(key)
      • 删除map.delete(key)
      • 检查map.has(key)
      • 遍历map.forEach(callback)for...of,可使用 map.keys(), map.values(), map.entries()
    • Set

      • 添加set.add(value)
      • 获取set.has(value)
      • 删除set.delete(value)
      • 遍历set.forEach(callback)for...of
  3. 键和值的存储:

    • Map:存储键值对,键可以是任何类型,值也可以是任何类型。
    • Set:存储唯一的值,值只能是单一类型(不包含键)。
  4. 适用场景:

    • Map:适用于需要频繁查询、更新键值对的数据结构,如缓存、字典、对象的属性管理等。
    • Set:适用于需要存储唯一值的数据结构,如集合操作、去重等。

示例代码

Map 示例:

let map = new Map();
map.set('name', 'John');
map.set('age', 30);

console.log(map.get('name')); // 输出: John
console.log(map.has('age')); // 输出: true

map.delete('age');
console.log(map.has('age')); // 输出: false

// 遍历
for (let [key, value] of map) {
  console.log(`${key}: ${value}`);
}

Set 示例:

let map = new Map();
map.set('name', 'John');
map.set('age', 30);

console.log(map.get('name')); // 输出: John
console.log(map.has('age')); // 输出: true

map.delete('age');
console.log(map.has('age')); // 输出: false

// 遍历
for (let [key, value] of map) {
  console.log(`${key}: ${value}`);
}

总结

  • Map 是键值对集合,适用于需要存储和操作键值对的场景,支持任何类型的键。
  • Set 是唯一值的集合,适用于需要保证值唯一的场景,主要存储单一类型的值。

两者都有用于存储和操作数据的特性,但其用途和操作方式根据实际需求的不同而有所区别。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来一一回答你的问题。 1. 顺序容器包括 vector、deque 和 list 三种。它们的基础数据结构分别是动态数组、双端队列和双向链表。其中,vector 在尾部插入和删除元素的时间复杂度为 O(1),在其他位置插入和删除的时间复杂度为 O(N);deque 在两端插入和删除元素的时间复杂度均为 O(1);list 在任意位置插入和删除元素的时间复杂度均为 O(1)。另外,vector 和 deque 支持随机访问,而 list 不支持。 2. 容器的共性包括:存储数据、提供访问数据的接口、实现数据的插入和删除、管理数据的内存分配和释放。 3. 容器适配器与标准容器之间的关系是,容器适配器是在标准容器的基础上提供了一些额外的功能,如 stack 和 queue 分别基于 deque 和 list 实现,提供了后进先出和先进先出的操作。 4. 关联容器包括 set、multisetmap 和 multimap 四种。其中,set 和 multiset 存储的是有序不重复的元素,map 和 multimap 存储的是有序键值对,键是唯一的。setmap 的底层实现是红黑树,multiset 和 multimap 的底层实现也是红黑树,但允许有重复的元素或键。 5. 表5.6对本章所介绍的容器进行了比较,包括底层数据结构、主要成员函数、是否支持[]与at()、数据插入方法、数据删除方法、成员是否有序、迭代器类型等方面。 6. 在运行效率方面,vector 的 erase 操作的时间复杂度为 O(N),因为要将后面的元素向前移动,而 list 的 erase 操作的时间复杂度为 O(1),因为只需要修改指针。在返回值方面,vector 的 erase 函数返回的是指向删除元素后一个元素的迭代器,而 list 的 erase 函数返回的是指向下一个元素的迭代器。下面是一个简单的程序,展示了 vector 和 list 的 erase 函数的差异: ```c++ #include <iostream> #include <vector> #include <list> int main() { std::vector<int> vec{1, 2, 3, 4, 5}; auto itv = vec.erase(vec.begin() + 2); // 删除元素3 for (auto i : vec) std::cout << i << " "; // 输出:1 2 4 5 std::cout << "\n"; std::cout << *itv << "\n"; // 输出:4 std::list<int> lst{1, 2, 3, 4, 5}; auto itl = lst.erase(++lst.begin()); // 删除元素2 for (auto i : lst) std::cout << i << " "; // 输出:1 3 4 5 std::cout << "\n"; std::cout << *itl << "\n"; // 输出:3 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值