JavaScript 中的 7 个新 Set 方法:`union()`、`intersection()`,以及其他 5 个

我们坦诚一点:你可能对 Set 并不怎么关心!至少直到现在……

Set 从 ES6 就已经存在了,但通常它们只是用来确保列表中没有重复项。

然而,随着这7个即将推出的内置 Set 方法,我们可能会发现自己更加频繁地使用它们。

1. union()

Set 的新方法 union() 为我们提供了两个集合中所有唯一的元素。

并且由于它是不可变的并返回副本,你可以无限链式调用它:

const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);

const unionSet = setA.union(setB); // Set {1, 2, 3, 4, 5}
2. intersection()

哪些元素同时存在于两个集合中?

const setA = new Set([1, 2, 3]);
const setB = new Set([2, 3, 4]);

const intersectionSet = setA.intersection(setB); // Set {2, 3}
3. difference()

difference() 方法执行 A - B,返回集合 A 中不在集合 B 中的所有元素:

const setA = new Set([1, 2, 3]);
const setB = new Set([2, 3, 4]);

const differenceSet = setA.difference(setB); // Set {1}

4. symmetricDifference()

正如 symmetric 所暗示的那样,此方法双向获取集合差集。即 (A — B) U (B — A)

所有只存在于其中一个集合中的元素:

const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);

const symmetricDifferenceSet = setA.symmetricDifference(setB); // Set {1, 2, 4, 5}
5. isSubsetOf()

其目的很明确:检查一个集合的所有元素是否都在另一个集合中。

const setA = new Set([1, 2]);
const setB = new Set([1, 2, 3]);

const isSubset = setA.isSubsetOf(setB); // true
6. isSupersetOf()

检查一个集合是否包含另一个集合中的所有元素:这与 isSubsetOf() 中交换两个集合的作用相同:

const setA = new Set([1, 2, 3]);
const setB = new Set([1, 2]);

const isSuperset = setA.isSupersetOf(setB); // true
isDisjointFrom()

这些集合是否没有任何共同元素?

const setA = new Set([1, 2, 3]);
const setB = new Set([4, 5, 6]);

const isDisjoint = setA.isDisjointFrom(setB); // true

在C++,我们可以使用`std::set`容器以及其提供的操作来实现集合的并集、交集、差集、补集、对称差集和幂集。这里是一个简单的示例: ```cpp #include <iostream> #include <set> #include <vector> // 函数模板用于操作集合 template<typename T> void union_set(const std::set<T>& set1, const std::set<T>& set2, std::set<T>& result) { result = set1; result.insert(set2.begin(), set2.end()); } template<typename T> void intersection_set(const std::set<T>& set1, const std::set<T>& set2, std::set<T>& result) { result.clear(); for (const auto& item : set1) { if (set2.find(item) != set2.end()) { result.insert(item); } } } template<typename T> void difference_set(const std::set<T>& set1, const std::set<T>& set2, std::set<T>& result) { result = set1; result.erase(std::remove(result.begin(), result.end(), set2.begin(), set2.end()), result.end()); } template<typename T> void complement_set(const std::set<T>& full_set, const std::set<T>& subset, std::set<T>& result) { result = full_set; result.erase(subset.begin(), subset.end()); } template<typename T> void symmetric_difference_set(const std::set<T>& set1, const std::set<T>& set2, std::set<T>& result) { result.clear(); result.insert(std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end())); result.insert(std::set_difference(set2.begin(), set2.end(), set1.begin(), set1.end())); } // 动态生成所有元素的幂集 template<typename T> std::vector<std::set<T>> power_set(const std::set<T>& base_set) { std::vector<std::set<T>> power(base_set.size() + 1); power[0] = {}; for (size_t i = 1; i <= base_set.size(); ++i) { for (const auto& element : base_set) { power[i].insert(element); power[i - 1].insert(element); } } return power; } int main() { std::set<int> set1 = {1, 2, 3}; std::set<int> set2 = {2, 4, 5}; std::set<int> union_result; intersection_set(set1, set2, union_result); std::cout << "Intersection: "; for (const auto& item : union_result) { std::cout << item << " "; } std::cout << "\n"; // ... (重复上述步骤,替换相应的函数名) return 0; } ``` 这段代码展示了如何分别实现集合的各种操作。注意,对于幂集,我们使用了嵌套循环的方式,这并不是最优解,尤其是在处理大集合时。实际应用可能会考虑使用回溯算法或其他更高效的策略。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changdapeng007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值