C++ STL(Standard Template Library)提供了多种容器类,分别用于存储不同类型的数据,满足不同的操作需求。下面介绍 STL 中常用的几种容器及它们的主要操作。
1. vector
vector 是 C++ STL 中最常用的动态数组类型,可以存储任意类型的对象。vector 通过数组实现,并且支持自动扩展大小以容纳新元素。vector 的主要操作包括:
push_back(elem)
:将元素添加到 vector 的末尾。pop_back()
:从 vector 的末尾删除一个元素。size()
:返回 vector 中元素的个数。clear()
:清空 vector 中所有元素。insert(pos, elem)
:在指定位置插入一个元素。erase(pos)
:从 vector 中删除指定位置的元素。front()
:返回 vector 的第一个元素。back()
:返回 vector 的最后一个元素。
下面是 vector 的一个例子:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec; // 声明一个 int 类型的 vector
vec.push_back(1); // 添加元素
vec.push_back(2);
vec.push_back(3);
cout << "vector size: " << vec.size() << endl; // 输出元素个数
for (int i = 0; i < vec.size(); ++i) { // 遍历输出元素值
cout << vec[i] << " ";
}
cout << endl;
vec.pop_back(); // 删除最后一个元素
vector<int>::iterator it; // 声明一个迭代器
for (it = vec.begin(); it != vec.end(); ++it) { // 通过迭代器遍历 vector 容器
cout << *it << " ";
}
cout << endl;
return 0;
}
2. deque
deque(双端队列)是一种 STL 中的顺序容器,与 vector 类似,也是用数组实现的。deque 支持高效地在队列头部和尾部添加或删除元素,并且支持随机访问。deque 主要操作包括:
push_front(elem)
:将元素添加到 deque 的前面。pop_front()
:从 deque 的前面删除一个元素。push_back(elem)
:将元素添加到 deque 的末尾。pop_back()
:从 deque 的末尾删除一个元素。size()
:返回 deque 中元素的个数。clear()
:清空 deque 中所有元素。insert(pos, elem)
:在指定位置插入一个元素。erase(pos)
:从 deque 中删除指定位置的元素。front()
:返回 deque 的第一个元素。back()
:返回 deque 的最后一个元素。
下面是 deque 的一个例子:
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq; // 声明一个 int 类型的 deque
dq.push_back(1); // 添加元素
dq.push_front(2);
dq.push_back(3);
cout << "deque size: " << dq.size() << endl; // 输出元素个数
for (int i = 0; i < dq.size(); ++i) { // 遍历输出元素值
cout << dq[i] << " ";
}
cout << endl;
dq.pop_front(); // 删除第一个元素
deque<int>::iterator it; // 声明一个迭代器
for (it = dq.begin(); it != dq.end(); ++it) { // 通过迭代器遍历 deque 容器
cout << *it << " ";
}
cout << endl;
return 0;
}
3. list
list(链表)是一种 STL 中的顺序容器,它使用链表实现。list 支持高效地在链表头部、尾部或任意位置添加或删除元素,并且支持双向迭代器进行遍历和访问。list 主要操作包括:
push_front(elem)
:将元素添加到 list 的前面。pop_front()
:从 list 的前面删除一个元素。push_back(elem)
:将元素添加到 list 的末尾。pop_back()
:从 list 的末尾删除一个元素。size()
:返回 list 中元素的个数。clear()
:清空 list 中所有元素。insert(pos, elem)
:在指定位置插入一个元素。erase(pos)
:从 list 中删除指定位置的元素。front()
:返回 list 的第一个元素。back()
:返回 list 的最后一个元素。
下面是 list 的一个例子:
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> li; // 声明一个 int 类型的 list
li.push_back(1); // 添加元素
li.push_front(2);
li.push_back(3);
cout << "list size: " << li.size() << endl; // 输出元素个数
list<int>::iterator it; // 声明一个迭代器
for (it = li.begin(); it != li.end(); ++it) { // 通过迭代器遍历 list 容器
cout << *it << " ";
}
cout << endl;
li.pop_front(); // 删除第一个元素
li.insert(li.begin(), 4); // 在开头插入元素
li.erase(--li.end()); // 删除最后一个元素
for (int elem : li) { // 遍历输出元素值
cout << elem << " ";
}
cout << endl;
return 0;
}
4. set
set 是一种 STL 中的关联容器,它存储有序且独一无二的元素集合。set 使用红黑树实现,因此支持高效查找和插入操作。set 主要操作包括:
insert(elem)
:将元素插入 set 中。erase(key)
:从 set 中删除指定元素。clear()
:清空 set 中所有元素。find(key)
:查找是否存在指定元素。size()
:返回 set 中元素的个数。empty()
:判断 set 是否为空。
下面是 set 的一个例子:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> st; // 声明一个 int 类型的 set
st.insert(3); // 插入元素
st.insert(1);
st.insert(4);
st.insert(2);
cout << "set size: " << st.size() << endl; // 输出元素个数
set<int>::iterator it; // 声明一个迭代器
for (it = st.begin(); it != st.end(); ++it) { // 通过迭代器遍历 set 容器
cout << *it << " ";
}
cout << endl;
st.erase(4); // 删除元素
if (!st.empty()) { // 判断 set 是否为空
it = st.find(2); // 查找元素
if (it != st.end()) {
cout << "found!" << endl;
}
}
st.clear(); // 清空 set 中的所有元素
return 0;
}
5. map
map 是一种 STL 中的关联容器,它存储由键值对组成的有序映射。map 使用红黑树实现,因此支持高效查找和插入操作。map 主要操作包括:
insert(pair)
:将键值对插入 map 中。erase(key)
:从 map 中删除指定键的值。clear()
:清空 map 中所有元素。find(key)
:查找是否存在指定键。count(key)
:返回指定键的元素个数。size()
:返回 map 中键值对的个数。empty()
:判断 map 是否为空。
下面是 map 的一个例子:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> mp; // 声明一个 string 和 int 类型的 map
mp.insert({"hello", 1}); // 插入键值对
mp.insert({"world", 2});
mp.insert({"good", 3});
mp.insert({"bye", 4});
cout << "map size: " << mp.size() << endl; // 输出元素个数
map<string, int>::iterator it; // 声明一个迭代器
for (it = mp.begin(); it != mp.end(); ++it) { // 通过迭代器遍历 map 容器
cout << it->first << ":" << it->second << " ";
}
cout << endl;
mp.erase("good"); // 删除元素
if (!mp.empty()) { // 判断 map 是否为空
it = mp.find("hello"); // 查找元素
if (it != mp.end()) {
cout << "found: " << it->second << endl;
}
}
cout << "bye count: " << mp.count("bye") << endl; // 输出指定键的元素个数
mp.clear(); // 清空 map 中的所有元素
return 0;
}