最近用set比较多,复习一下基础。
在C++中,vector
、deque
、list
、set
、multiset
、unordered_set
和unordered_multiset
都是容器类,但它们有不同的特点和用途。下面是对它们的区别和示例说明:
1. vector
- 特点: 动态数组,支持快速随机访问(通过索引)。
- 时间复杂度: 插入和删除操作在末尾是常数时间复杂度,在中间和开头是线性时间复杂度。访问元素是常数时间复杂度。
- 用途: 适用于需要频繁随机访问和在末尾进行插入和删除的情况。
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3};
vec.push_back(4); // 在末尾插入
vec[1] = 10; // 通过索引访问和修改
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
2. deque
- 特点: 双端队列,支持快速在两端进行插入和删除。
- 时间复杂度: 两端插入和删除是常数时间复杂度,随机访问是常数时间复杂度。
- 用途: 适用于需要在两端进行插入和删除操作的情况。
cpp
#include <deque>
#include <iostream>
int main() {
std::deque<int> deq = {1, 2, 3};
deq.push_front(0); // 在前端插入
deq.push_back(4); // 在末尾插入
for (int n : deq) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
3. list
- 特点: 双向链表,支持快速在任意位置进行插入和删除,但不支持随机访问。
- 时间复杂度: 插入和删除是常数时间复杂度,访问元素是线性时间复杂度。
- 用途: 适用于需要频繁插入和删除元素而不需要随机访问的情况。
cpp
#include <list>
#include <iostream>
int main() {
std::list<int> lst = {1, 2, 3};
lst.push_front(0); // 在前端插入
lst.push_back(4); // 在末尾插入
auto it = lst.begin();
std::advance(it, 2);
lst.insert(it, 10); // 在中间插入
for (int n : lst) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
4. set
- 特点: 有序集合,元素不重复,自动排序。
- 时间复杂度: 插入、删除、查找操作是对数时间复杂度。
- 用途: 适用于需要有序集合且元素唯一的情况。
cpp
#include <set>
#include <iostream>
int main() {
std::set<int> s = {3, 1, 2};
s.insert(4); // 插入元素
for (int n : s) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
5. multiset
- 特点: 有序集合,允许重复元素,自动排序。
- 时间复杂度: 插入、删除、查找操作是对数时间复杂度。
- 用途: 适用于需要有序集合且允许重复元素的情况。
cpp
#include <set>
#include <iostream>
int main() {
std::multiset<int> ms = {3, 1, 2, 2};
ms.insert(4); // 插入元素
for (int n : ms) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
6. unordered_set
- 特点: 无序集合,元素不重复,使用哈希表实现。
- 时间复杂度: 插入、删除、查找操作是平均常数时间复杂度。
- 用途: 适用于需要快速查找且不关心顺序的情况。
cpp
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> us = {3, 1, 2};
us.insert(4); // 插入元素
for (int n : us) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
7. unordered_multiset
- 特点: 无序集合,允许重复元素,使用哈希表实现。
- 时间复杂度: 插入、删除、查找操作是平均常数时间复杂度。
- 用途: 适用于需要快速查找且允许重复元素的情况。
cpp
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_multiset<int> ums = {3, 1, 2, 2};
ums.insert(4); // 插入元素
for (int n : ums) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}