📅  最后修改于: 2023-12-03 14:51:38.061000             🧑  作者: Mango
C++ STL是C++标准库提供的重要组成部分,它为C++程序员提供了许多常用的数据结构和算法。使用STL可以使代码更加高效和简单。
STL提供了以下常用的容器:
vector是STL提供的一个可变大小的数组。可以使用以下代码定义和初始化一个vector:
#include <vector>
std::vector<int> vec1; // 空vector
std::vector<int> vec2(10); // 长度为10的vector,每个元素都是默认值0
std::vector<int> vec3(10, 1); // 长度为10的vector,每个元素都是1
std::vector<int> vec4 = {1,2,3,4,5}; // 长度为5的vector,元素分别为1,2,3,4,5
可以使用以下方法向vector中加入元素:
std::vector<int> vec;
vec.push_back(1); // 在vector的末尾加入1
vec.insert(vec.begin(), 2); // 在vector的头部加入2
vec.insert(vec.begin()+1, 3); // 在vector的第2个元素位置插入3
可以使用以下方法遍历vector中的元素:
std::vector<int> vec = {1,2,3,4,5};
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
for (int i : vec) {
std::cout << i << " ";
}
deque是STL提供的双向队列。可以使用以下代码定义和初始化一个deque:
#include <deque>
std::deque<int> deque1; // 空deque
std::deque<int> deque2(10); // 长度为10的deque,每个元素都是默认值0
std::deque<int> deque3(10, 1); // 长度为10的deque,每个元素都是1
std::deque<int> deque4 = {1,2,3,4,5}; // 长度为5的deque,元素分别为1,2,3,4,5
可以使用以下方法向deque中加入元素:
std::deque<int> deque;
deque.push_back(1); // 在deque的末尾加入1
deque.push_front(2); // 在deque的头部加入2
deque.insert(deque.begin()+1, 3); // 在deque的第2个元素位置插入3
可以使用以下方法遍历deque中的元素:
std::deque<int> deque = {1,2,3,4,5};
for (int i = 0; i < deque.size(); ++i) {
std::cout << deque[i] << " ";
}
for (auto it = deque.begin(); it != deque.end(); ++it) {
std::cout << *it << " ";
}
for (int i : deque) {
std::cout << i << " ";
}
list是STL提供的双向链表。可以使用以下代码定义和初始化一个list:
#include <list>
std::list<int> list1; // 空list
std::list<int> list2(10); // 长度为10的list,每个元素都是默认值0
std::list<int> list3(10, 1); // 长度为10的list,每个元素都是1
std::list<int> list4 = {1,2,3,4,5}; // 长度为5的list,元素分别为1,2,3,4,5
可以使用以下方法向list中加入元素:
std::list<int> list;
list.push_back(1); // 在list的末尾加入1
list.push_front(2); // 在list的头部加入2
list.insert(list.begin(), 3); // 在list的第1个元素位置插入3
可以使用以下方法遍历list中的元素:
std::list<int> list = {1,2,3,4,5};
for (auto it = list.begin(); it != list.end(); ++it) {
std::cout << *it << " ";
}
for (int i : list) {
std::cout << i << " ";
}
set是STL提供的有序不重复元素的集合。可以使用以下代码定义和初始化一个set:
#include <set>
std::set<int> set1; // 空set
std::set<int> set2 = {4,2,3,1,5}; // 元素分别为1,2,3,4,5
可以使用以下方法向set中加入元素:
std::set<int> set;
set.insert(1); // 加入元素1
set.insert(2); // 加入元素2
set.insert(3); // 加入元素3
可以使用以下方法遍历set中的元素:
std::set<int> set = {1,2,3,4,5};
for (auto it = set.begin(); it != set.end(); ++it) {
std::cout << *it << " ";
}
for (int i : set) {
std::cout << i << " ";
}
multiset是STL提供的有序可重复元素的集合。可以使用以下代码定义和初始化一个multiset:
#include <set>
std::multiset<int> set1; // 空multiset
std::multiset<int> set2 = {4,2,3,1,5,1,2,3,4,5}; // 元素分别为1,1,2,2,3,3,4,4,5,5
可以使用以下方法向multiset中加入元素:
std::multiset<int> set;
set.insert(1); // 加入元素1
set.insert(2); // 加入元素2
set.insert(3); // 加入元素3
set.insert(1); // 加入元素1
可以使用以下方法遍历multiset中的元素:
std::multiset<int> set = {1,1,2,2,3,3,4,4,5,5};
for (auto it = set.begin(); it != set.end(); ++it) {
std::cout << *it << " ";
}
for (int i : set) {
std::cout << i << " ";
}
map是STL提供的有序键-值对的映射表。可以使用以下代码定义和初始化一个map:
#include <map>
std::map<std::string, int> map1; // 空map,键为字符串,值为整数
std::map<std::string, int> map2 = {{"a", 1}, {"b", 2}, {"c", 3}};
// 长度为3的map,键分别为"a"、"b"、"c",值分别为1、2、3
可以使用以下方法向map中加入键-值对:
std::map<std::string, int> map;
map["a"] = 1; // 添加键"a",值为1
map.insert(std::make_pair("b", 2)); // 添加键"b",值为2
可以使用以下方法遍历map中的键-值对:
std::map<std::string, int> map = {{"a", 1}, {"b", 2}, {"c", 3}};
for (auto it = map.begin(); it != map.end(); ++it) {
std::cout << it->first << ":" << it->second << " ";
}
for (auto [key, value] : map) {
std::cout << key << ":" << value << " ";
}
multimap是STL提供的有序键-值对可以重复的映射表。可以使用以下代码定义和初始化一个multimap:
#include <map>
std::multimap<std::string, int> map1; // 空multimap,键为字符串,值为整数
std::multimap<std::string, int> map2 = {{"a", 1}, {"b", 2}, {"c", 3}, {"a", 4}};
// 长度为4的multimap,键分别为"a"、"b"、"c"、"a",值分别为1、2、3、4
可以使用以下方法向multimap中加入键-值对:
std::multimap<std::string, int> map;
map.insert(std::make_pair("a", 1)); // 添加键"a",值为1
map.insert(std::make_pair("b", 2)); // 添加键"b",值为2
map.insert(std::make_pair("a", 3)); // 添加键"a",值为3
可以使用以下方法遍历multimap中的键-值对:
std::multimap<std::string, int> map = {{"a", 1}, {"b", 2}, {"c", 3}, {"a", 4}};
for (auto it = map.begin(); it != map.end(); ++it) {
std::cout << it->first << ":" << it->second << " ";
}
for (auto [key, value] : map) {
std::cout << key << ":" << value << " ";
}
STL提供了以下常用的算法:
sort可以对序列进行排序。可以使用以下代码对一个vector进行排序:
std::vector<int> vec = {3,1,4,2,5};
std::sort(vec.begin(), vec.end()); // 对vec进行排序
for (int i : vec) {
std::cout << i << " ";
}
binary_search可以在有序序列中查找元素。可以使用以下代码在一个vector中查找元素5:
std::vector<int> vec = {1,2,3,4,5};
if (std::binary_search(vec.begin(), vec.end(), 5)) {
std::cout << "found" << std::endl;
} else {
std::cout << "not found" << std::endl;
}
lower_bound可以在有序序列中查找第一个不小于某个元素的位置。可以使用以下代码在一个vector中查找第一个不小于元素3的位置:
std::vector<int> vec = {1,2,3,3,4,5};
auto it = std::lower_bound(vec.begin(), vec.end(), 3); // 返回指向第一个不小于3的位置的迭代器
std::cout << std::distance(vec.begin(), it) << std::endl; // 输出3
upper_bound可以在有序序列中查找第一个大于某个元素的位置。可以使用以下代码在一个vector中查找第一个大于元素3的位置:
std::vector<int> vec = {1,2,3,3,4,5};
auto it = std::upper_bound(vec.begin(), vec.end(), 3); // 返回指向第一个大于3的位置的迭代器
std::cout << std::distance(vec.begin(), it) << std::endl; // 输出4
next_permutation可以求给定序列的下一个排列。可以使用以下代码求给定序列的下一个排列:
std::vector<int> vec = {1,2,3};
do {
for (int i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
} while (std::next_permutation(vec.begin(), vec.end()));
prev_permutation可以求给定序列的上一个排列。可以使用以下代码求给定序列的上一个排列:
std::vector<int> vec = {3,2,1};
do {
for (int i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
} while (std::prev_permutation(vec.begin(), vec.end()));
本文介绍了C++ STL的常用容器和算法。熟练掌握STL可以让C++程序员更加高效地编写程序。