📜  填写C++ STL(1)

📅  最后修改于: 2023-12-03 14:51:38.061000             🧑  作者: Mango

填写C++ STL

C++ STL是C++标准库提供的重要组成部分,它为C++程序员提供了许多常用的数据结构和算法。使用STL可以使代码更加高效和简单。

容器(Containers)

STL提供了以下常用的容器:

  • vector:可变大小的数组。
  • deque:双向队列。
  • list:双向链表。
  • set:有序不重复元素的集合。
  • multiset:有序可重复元素的集合。
  • map:有序键-值对的映射表。
  • multimap:有序键-值对可以重复的映射表。
vector

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

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

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

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

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

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

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 << " ";
}
算法(Algorithms)

STL提供了以下常用的算法:

  • sort:对序列进行排序。
  • binary_search:在有序序列中查找元素。
  • lower_bound:在有序序列中查找第一个不小于某个元素的位置。
  • upper_bound:在有序序列中查找第一个大于某个元素的位置。
  • next_permutation:求给定序列的下一个排列。
  • prev_permutation:求给定序列的上一个排列。
sort

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

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

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

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

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

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++程序员更加高效地编写程序。