C++ STL学习笔记(一) : container 容器
一个自用的C++ 参考手册,学习方向参考C++ 大学教程第九版。本节关键词:container 容器
sequence container
array
std::array
是一个固定大小的数组容器,它在编译时就确定了大小,并且提供了类似于 C 数组的访问方式。
#include <array>
std::array<int, 5> myArray = {1, 2, 3, 4, 5};
for (const auto& element : myArray) {
std::cout << element << " ";
}
deque
std::deque
是一个双端队列容器,支持在两端进行快速插入和删除操作。
#include <deque>
std::deque<int> myDeque = {1, 2, 3};
myDeque.push_front(0); // 在前面插入元素
myDeque.push_back(4); // 在后面插入元素
for (const auto& element : myDeque) {
std::cout << element << " ";
}
forward_list
std::forward_list
是一个单向链表容器,只能从前往后遍历,没有提供反向遍历的功能。
#include <forward_list>
std::forward_list<int> myList = {1, 2, 3};
myList.push_front(0); // 在前面插入元素
for (const auto& element : myList) {
std::cout << element << " ";
}
list
std::list
是一个双向链表容器,支持在任意位置进行快速插入和删除操作。
#include <list>
std::list<int> myList = {1, 2, 3};
myList.push_front(0); // 在前面插入元素
myList.push_back(4); // 在后面插入元素
for (const auto& element : myList) {
std::cout << element << " ";
}
vector
std::vector
是一个动态数组容器,支持在尾部进行快速插入和删除操作,并且可以通过索引进行随机访问。
#include <vector>
std::vector<int> myVector = {1, 2, 3};
myVector.push_back(4); // 在后面插入元素
for (const auto& element : myVector) {
std::cout << element << " ";
}
ordered associative container
set
std::set
是一个有序集合容器,其中的元素按照升序进行排序,并且不允许重复元素的存在。
#include <set>
std::set<int> mySet = {3, 1, 4, 1, 5};
for (const auto& element : mySet) {
std::cout << element << " ";
}
multiset
std::multiset
是一个有序多重集合容器,其中的元素按照升序进行排序,允许重复元素的存在。
#include <set>
std::multiset<int> myMultiset = {3, 1, 4, 1, 5};
for (const auto& element : myMultiset) {
std::cout << element << " ";
}
map
std::map
是一个有序键值对容器,其中的元素按照键的升序进行排序,并且不允许重复的键。
#include <map>
std::map<std::string, int> myMap = {{"apple", 3}, {"banana", 2}, {"cherry", 5}};
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
multimap
std::multimap
是一个有序多重键值对容器,其中的元素按照键的升序进行排序,允许重复的键的存在。
#include <map>
std::multimap<std::string, int> myMultimap = {{"apple", 3}, {"banana", 2}, {"apple", 5}};
for (const auto& pair : myMultimap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
unordered associative container
unordered_set
std::unordered_set
是一个无序集合容器,其中的元素存储无序,并且不允许重复元素的存在。它使用哈希表实现,因此插入、删除和查找操作的平均时间复杂度是常数时间。
#include <unordered_set>
std::unordered_set<int> myUnorderedSet = {3, 1, 4, 1, 5};
for (const auto& element : myUnorderedSet) {
std::cout << element << " ";
}
unordered_multiset
std::unordered_multiset
是一个无序多重集合容器,其中的元素存储无序,允许重复元素的存在。它使用哈希表实现,因此插入、删除和查找操作的平均时间复杂度是常数时间。
#include <unordered_set>
std::unordered_multiset<int> myUnorderedMultiset = {3, 1, 4, 1, 5};
for (const auto& element : myUnorderedMultiset) {
std::cout << element << " ";
}
unordered_map
std::unordered_map
是一个无序键值对容器,其中的元素存储无序,并且不允许重复的键。它使用哈希表实现,因此插入、删除和查找操作的平均时间复杂度是常数时间。
#include <unordered_map>
std::unordered_map<std::string, int> myUnorderedMap = {{"apple", 3}, {"banana", 2}, {"cherry", 5}};
for (const auto& pair : myUnorderedMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
unordered_multimap
std::unordered_multimap
是一个无序多重键值对容器,其中的元素存储无序,允许重复的键的存在。它使用哈希表实现,因此插入、删除和查找操作的平均时间复杂度是常数时间。
#include <unordered_map>
std::unordered_multimap<std::string, int> myUnorderedMultimap = {{"apple", 3}, {"banana", 2}, {"apple", 5}};
for (const auto& pair : myUnorderedMultimap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
container adapter
stack
std::stack
是一个容器适配器,它提供了栈(后进先出)的功能。它基于某个底层容器实现,默认使用std::deque
作为底层容器。
#include <stack>
std::stack<int> myStack;
myStack.push(1); // 入栈
myStack.push(2);
myStack.push(3);
while (!myStack.empty()) {
std::cout << myStack.top() << " "; // 访问栈顶元素
myStack.pop(); // 出栈
}
queue
std::queue
是一个容器适配器,它提供了队列(先进先出)的功能。它基于某个底层容器实现,默认使用std::deque
作为底层容器。
#include <queue>
std::queue<int> myQueue;
myQueue.push(1); // 入队
myQueue.push(2);
myQueue.push(3);
while (!myQueue.empty()) {
std::cout << myQueue.front() << " "; // 访问队头元素
myQueue.pop(); // 出队
}
priority_queue
std::priority_queue
是一个容器适配器,它提供了优先队列的功能,其中的元素按照一定的优先级进行排序。默认情况下,它使用std::vector
作为底层容器,并且使用元素的比较运算符来确定优先级。
#include <queue>
std::priority_queue<int> myPriorityQueue;
myPriorityQueue.push(3); // 入队
myPriorityQueue.push(1);
myPriorityQueue.push(4);
myPriorityQueue.push(1);
myPriorityQueue.push(5);
while (!myPriorityQueue.empty()) {
std::cout << myPriorityQueue.top() << " "; // 访问队头元素
myPriorityQueue.pop(); // 出队
}
bitset
std::bitset
是 C++ 标准库提供的一个位集容器。它用于表示固定大小的二进制位序列,并提供了一系列操作函数来对位进行设置、清除、翻转和查询等操作。
#include <bitset>
#include <iostream>
int main() {
// 创建一个包含8个位的 bitset,初始值为0
std::bitset<8> bits;
// 设置位
bits.set(1); // 将第2位设置为1
bits.set(3, true); // 将第4位设置为1
// 清除位
bits.reset(2); // 将第3位设置为0
bits.reset(4, true); // 将第5位设置为0
// 翻转位
bits.flip(5); // 将第6位翻转(0变为1,1变为0)
// 查询位
bool value1 = bits.test(2); // 检查第3位的值
bool value2 = bits[4]; // 通过下标运算符检查第5位的值
// 输出位集的值
std::cout << bits << std::endl;
// 输出每个位的值
for (size_t i = 0; i < bits.size(); ++i) {
std::cout << "Bit at position " << i << ": " << bits[i] << std::endl;
}
return 0;
}
在这个示例中,我们首先创建了一个包含 8 个位的 std::bitset
对象 bits
,初始值为 0。然后,我们使用 set()
函数将第 2 位和第 4 位设置为 1,使用 reset()
函数将第 3 位和第 5 位设置为 0,使用 flip()
函数翻转第 6 位。接着,我们使用 test()
函数和下标运算符 []
查询特定位的值,并使用 std::cout
输出整个位集的值。最后,我们使用一个循环遍历每个位,并输出它们的值。输出结果如下:
01101101
Bit at position 0: 0
Bit at position 1: 1
Bit at position 2: 1
Bit at position 3: 0
Bit at position 4: 1
Bit at position 5: 1
Bit at position 6: 0
Bit at position 7: 1
最后修改于 2023-09-10