unordered_set和set insert和push_back的区别

本文比较了C++STL中unordered_set和set在内部实现、性能、元素顺序以及insert和push_back方法上的异同,强调了它们各自的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unordered_setset 是 C++ STL 中的两种不同类型的容器,它们都用于存储唯一元素,但内部实现和特性有所不同:

unordered_set vs set

  1. 内部实现:

    • set 基于平衡二叉树(通常是红黑树)实现,因此它的元素总是有序的。
    • unordered_set 基于哈希表实现,因此它的元素是无序的。
  2. 性能:

    • 对于 set,查找、插入和删除操作的时间复杂度通常是 O(log n)。
    • 对于 unordered_set,这些操作的平均时间复杂度是 O(1),但最坏情况下可以退化到 O(n),尤其是当哈希冲突较多时。
  3. 元素顺序:

    • set 中的元素会根据元素的值自动排序。
    • unordered_set 中的元素没有特定的顺序。

insert vs push_back

  • insert:

    • insert 方法用于将元素添加到容器中,如 set, unordered_set, map, unordered_map 等。
    • 对于 vectordequeinsert 可以在指定的迭代器位置插入元素或元素序列。
    • insert 不会改变容器中现有元素的顺序(对于有序容器如 set,元素会插入到保持顺序的正确位置)。
  • push_back:

    • push_back 专门用于顺序容器如 vector, deque, list 等,用于在容器的末尾添加一个元素。
    • push_back 只接受一个元素作为参数,并将其添加到容器的尾部。

简而言之,unordered_setset 在性能和元素排序方面有显著差异,而 insertpush_back 则用于不同类型的容器,具有不同的用途和行为。

### C++ 中 `unordered_set` 的第二种用途或常见问题 在探讨 C++ 中 `unordered_set` 的其他应用时,可以考虑其用于去除重复元素并统计频率的功能。此容器存储唯一键且不保持任何特定顺序[^1]。 对于字符串处理中的词频统计问题,虽然通常会联想到使用 `unordered_map` 来实现,但是也可以巧妙利用 `unordered_set` 达成目的。具体来说,在计算单词出现次数之前先通过 `unordered_set` 去重,再配合计数器完成任务。不过更常见的做法还是直接采用 `unordered_map` 或者 `map` 完整记录每个关键词及其对应的数量关系[^2]。 下面是一个基于 `unordered_set` 辅助结构来统计不同词语出现次数的例子: ```cpp #include <iostream> #include <sstream> #include <unordered_set> #include <vector> #include <algorithm> using namespace std; void wordFrequency(const string& text) { unordered_set<string> uniqueWords; vector<pair<string, int>> frequencyList; stringstream ss(text); string word; while (ss >> word) { if(uniqueWords.find(word)==uniqueWords.end()){ uniqueWords.insert(word); frequencyList.push_back(make_pair(word, 1)); }else{ auto it = find_if(frequencyList.begin(), frequencyList.end(), [&word](const pair<string,int>& p){return p.first==word;}); ++(it->second); } } cout << "Frequencies of individual words are:" << endl; for(auto &p : frequencyList){ cout << "(" << p.first << ", " << p.second << ") "; } } ``` 上述代码展示了如何结合 `unordered_set` 实现基本功能,但实际上为了简化逻辑提高效率,建议直接运用 `unordered_map` 处理此类场景下的数据集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值