c++ 11 list转set

list<int>	li;
	for (int i = 0; i < 100; i++){
		li.push_back(i);
	}
	for (int i = 0; i < 100; i++){
		li.push_back(i);
	}
	unordered_set<int>	uset(li.begin(), li.end()); //用list去初始化set
	cout << uset.size() << endl;
	for (auto i : uset){
		cout << i << ",";
	}
### C++ `set` 和 `list` 的使用及区别 #### 1. **C++ `set` 容器概述** `std::set` 是一种关联容器,通常由红黑树实现。它的特点是存储唯一的关键字,并保持关键字始终处于排序状态[^5]。 - 插入操作的时间复杂度为 O(log n),因为它需要维护内部的平衡二叉搜索树结构。 - 查找和删除操作也具有相同的时间复杂度 O(log n)[^3]。 - 不允许重复元素的存在,如果需要支持多重集,则应考虑使用 `multiset`。 以下是创建、插入和遍历 `set` 的简单示例: ```cpp #include <iostream> #include <set> using namespace std; int main() { set<int> s; // Insert elements into the set s.insert(10); s.insert(20); s.insert(5); // Iterate over all elements in ascending order for (auto it = s.begin(); it != s.end(); ++it) { cout << *it << " "; } return 0; } ``` #### 2. **C++ `list` 容器概述** `std::list` 则是一种双向链表形式的序列容器。相比其他序列容器(如 `vector` 或 `deque`),它提供了高效的中间位置插入与删除能力[^4]。 - 插入或移除任意位置上的节点只需常数时间 O(1),前提是已经拥有指向该位置的有效迭代器。 - 随机访问性能较差,因为必须从头或尾逐一遍历至目标节点,最坏情况下的时间复杂度为 O(n)。 下面是一个简单的 `list` 使用案例: ```cpp #include <iostream> #include <list> using namespace std; int main() { list<int> l {1, 2, 3}; // Add an element at front l.push_front(0); // Remove last element l.pop_back(); // Traverse through each item using range-based loop for(int i : l){ cout << i << ' '; } return 0; } ``` #### 3. **两者的主要差异** | 特性 | `std::set` | `std::list` | |---------------------|------------------------------------|------------------------------------| | 底层数据结构 | 平衡二叉搜索树 | 双向链表 | | 存储顺序 | 自动按键值升序排列 | 插入时保留原有次序 | | 唯一性 | 所有元素均需独一无二 | 支持重复 | | 访问速度 | 较慢 | 更快 | | 插删效率 | 较高 | 极高 | --- ### 结论 综上所述,选择合适的容器取决于具体应用场景的要求。当关注点在于快速定位特定数值或是希望维持严格意义上的有序集合时,推荐选用 `set`;而当频繁涉及大量连续区域内的增减变动动作且无需关心整体布局形态的时候,则更适合采用 `list`[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值