文章目录
一、STL标准库
STL(Standard Template Library)是C++标准库的一部分,它提供了许多有用的容器、算法和迭代器。STL的设计目标是提供高效、通用、可复用的数据结构和算法,以及一致的接口和编程风格,使得C++程序员能够更加方便地编写高质量的代码。
STL主要包含以下三个组件:
- 容器(Containers):容器是用于存储和组织数据的类模板,提供了多种数据结构,如向量、列表、映射、集合等。容器可以存储任意类型的数据,并提供了丰富的操作接口,如插入、删除、访问等。STL的容器类模板具有高效的内存管理和数据操作,适用于各种不同的应用场景。
- 迭代器(Iterators):迭代器是一种泛型指针,用于遍历容器中的元素。STL的迭代器提供了统一的访问容器元素的接口,使得算法和容器之间的解耦成为可能。通过使用迭代器,可以实现容器的遍历、查找、排序等操作,同时提高了代码的可读性和可维护性。
- 算法(Algorithms):算法是用于对数据进行操作和处理的函数模板,STL提供了大量的常用算法,如排序、搜索、计算等。这些算法具有通用性,可以应用于不同类型的容器和数据,同时具有高效的实现和优化。通过使用STL的算法,可以简化代码、提高开发效率,并且减少错误的可能性。
1.1 string(字符串类)
string 是 C++ 标准库提供的字符串类,用于处理动态大小的字符串。它提供了丰富的成员函数来处理字符串的操作,如连接、比较、查找等。
| 函数名称 | 作用 |
|---|---|
| size() 或 length() | 返回字符串的长度 |
| empty() | 检查字符串是否为空 |
| append() | 在字符串末尾追加内容 |
| substr() | 提取子字符串 |
| find() | 查找子字符串的位置 |
| replace() | 替换子字符串 |
| c_str() | 返回 C 风格字符串 |
1.2 容器
1.2.1 vector(动态数组)
vector与数组array类似,其使用更加灵活的动态空间来进行配置。在空间不足的时候,vector可以自动扩展空间容纳新元素,做到按需供给。在扩充空间的过程中仍然需要的是,重新分配空间、移动数据、释放原空间。
at( )
// 构造
std::vector<int> vec;
// 修改元素
vec.at(1) = 20;
push_back( )
// 添加元素到末尾
vec.push_back(6);
pop_back( )
// 删除最后一个元素
vec.pop_back();
insert( )
// 插入元素
vec.insert(vec.begin() + 2, 15); // 在第三个位置插入 15
erase( )
// 删除指定位置的元素
vec.erase(vec.begin() + 2);
clear( )
// 清空 vector
vec.clear();
1.2.2 stack(栈)
stack 是一个容器适配器,它基于其他容器(如 deque 或 vector)实现了栈的功能,栈遵循后进先出(LIFO)原则。
push( )
//构造stack
std::stack<int> s;
//将元素压入栈中。
s.push(10);
pop( )
//弹出栈顶元素
s.pop();
top( )
//访问栈顶元素
int topElement = s.top();
empty( )
//检查栈是否为空
bool isEmpty = s.empty();
size( )
//返回栈中的元素个数
size_t stackSize = s.size();
1.2.3 queue(队列)
queue 是一个容器适配器,它基于其他容器(如 deque)实现了队列的功能,队列遵循先进先出(FIFO)原则。常用函数如下:
push( )
//构造
std::queue<int> q;
//将元素添加到队列尾部
q.push(10);
pop( )
//从队列头部移除元素
q.pop();
front( )
//访问队列头部元素。
int frontElement = q.front();
back( )
//访问队列尾部元素。
int backElement = q.back();
empty( )
//检查队列是否为空
bool isEmpty = q.empty();
size( )
//返回队列中的元素个数
size_t queueSize = q.size();
1.2.4 list(双向链表)
list 是一个双向链表容器,允许在链表的任何位置快速插入和删除元素,但访问元素的速度较慢,因为必须通过链表遍历。
push_XXX( )
std::list<int> lst;
//在链表末尾添加元素
lst.push_back(10);
//在链表开头添加元素
lst.push_front(20);
pop_XXX( )
//从链表末尾移除元素
lst.pop_back();
//从链表开头移除元素
lst.pop_front();
front( )
//访问链表的第一个元素。
int frontElement = lst.front();
back( )
//访问链表的最后一个元素
int backElement = lst.back();
insert( )
//在指定位置插入元素
std::list<int>::iterator it = lst.begin();
lst.insert(it, 15); // 在位置it之前插入15
erase( )
//移除指定位置的元素
lst.erase(it); // 移除位置it的元素
empty( )
//检查链表是否为空。
bool isEmpty = lst.empty();
size( )
//返回链表中的元素个数。
size_t listSize = lst.size();
1.2.5 unordered_map(哈希映射)和unordered_set(哈希集合)
哈希表容器是由unordered_map和unordered_set提供的。它们使用哈希表来存储和查找元素,能够在平均情况下实现常数时间的插入、删除和查找操作。
unordered_map 是一个关联容器,它存储的是键值对(key-value pairs),每个键都是唯一的。它使用哈希表来实现,因此插入、删除和查找操作在平均情况下具有常数时间复杂度。
unordered_set 是一个集合容器,它存储的是唯一的元素,没有重复。它使用哈希表来实现,因此插入、删除和查找操作在平均情况下也具有常数时间复杂度。
使用哈希表容器的优势
- 快速查找:哈希表提供了常数时间的查找、插入和删除操作。
- 唯一性:对于unordered_set,哈希表确保了元素的唯一性。
适用场景
- 当需要快速查找、插入和删除操作时,unordered_map和unordered_set是很好的选择。
- 当需要存储键值对数据时,unordered_map是合适的选择。
- 当需要存储唯一元素集合时,unordered_set是合适的选择。
unordered_map 常用操作
insert( )
//插入元素
myMap["key"] = value;
myMap.insert({"key", value});
find( )
返回指向该键值对的迭代器;如果键不存在,返回 end() 迭代器。
//查找元素
auto it = myMap.find("key");
erase( )
//删除元素
myMap.erase("key");
count( )
对于 std::unordered_map,返回值只能是 0 或 1,因为每个键在 unordered_map 中是唯一的
//检查某个元素是否存在于哈希表中
my_map.count(key);
unordered_set 常见操作
insert( )
//插入元素:
mySet.insert(value);
find( )
//查找元素
auto it = mySet.find(value);
erase( )
//删除元素
mySet.erase(value);
count( )
对于 std::unordered_set,返回值同样是 0 或 1,因为集合中的元素是唯一的。
//检查某个元素是否存在于哈希集合(std::unordered_set)中。
my_set.count(element);
1.2.6 集合
set 是 C++ 标准库中的一个关联容器,用于存储唯一元素,并且这些元素会自动按照升序(默认)或用户定义的顺序进行排序。set 的底层实现基于平衡二叉搜索树(通常是红黑树),因此它提供了高效的插入、删除和查找操作。set具有:
- 唯一性:set 中的每个元素都是唯一的,如果尝试插入一个已经存在的元素,插入操作不会生效。
- 有序性:set 中的元素会自动按照升序排列(默认情况下)。
- 动态大小:可以根据需要自动调整其大小。
set的使用方法和哈希映射(集合)类似,但是二者存在一定区别:
| 特性 | set | unordered_set |
|---|---|---|
| 底层实现 | 平衡二叉搜索树 | 哈希表 |
| 有序性 | 按升序排列(默认) | 无序 |
| 查找时间复杂度 | O(log n) | 平均 O(1),最坏 O(n) |
| 适用场景 | 需要有序存储 | 需要快速查找、插入、删除,且不关心顺序 |
二、常用函数
2.1 sort( )
sort 用于对容器或数组中的元素进行排序。它位于 头文件中。
// 升序排列
/* 如果是字符串的组合,则会根据其前缀的公共程度排序,例如:14.最长公共前缀 */
sort(起始迭代器, 结束迭代器);
// 降序排列
sort(v.begin(), v.end(), std::greater<int>());
2.2 reverse( )
reverse 用于反转容器或数组中元素的顺序,同样位于 头文件中。
reverse(起始迭代器, 结束迭代器);
2.3 max( ) 和 min( )
max 和 min 用于获取两个值中的最大值和最小值,定义在 头文件中。
// 取较大者
max(a, b);
// 取较小者
min(a, b);
2.4 accumulate( )
accumulate 用于计算容器或数组中元素的累计和,它定义在 头文件中。
accumulate(起始迭代器, 结束迭代器, 初始值);
2.5 find( )
find 用于在容器或数组中查找指定的元素,返回一个指向该元素的迭代器,它位于 头文件中。
/* 这里类似与容器中的.find,如果没有找到了会返回.end */
find(起始迭代器, 结束迭代器, 要查找的值);
2.6 copy( )
copy 用于将一个范围内的元素复制到另一个范围,位于 头文件中。
copy(起始迭代器, 结束迭代器, 目标起始迭代器(可选));
2.7 to_string( )
to_string 是 C++ 标准库中的一个函数,用于将数值类型转换为其对应的字符串表示形式。
/* 将基本的数值类型(如整数、浮点数)转换为 string 类型的字符串。 */
/* 返回值是一个 std::string,其中包含了数值的字符串表示形式。 */
string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
2.8 stoi( )
stoi用于将string 类型的字符串转换为 int 类型的整数。stoi 是 string to integer 的缩写。
int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
- 参数说明
- str:要转换的字符串。
- pos(可选):指向 size_t 的指针,函数执行完毕后,这个指针会指向第一个未处理字符的下标。如果不需要,可以传递 nullptr 或使用默认值。
- base(可选):表示进制,默认为 10,表示将字符串解释为十进制数。如果需要转换其他进制的数,比如二进制、八进制或十六进制,可以传递相应的值(2、8、16)。
- 返回值:返回转换后的整数值。
2.9 getline( )
agetline 函数在 C++ 中用于从输入流中读取一行文本,直到遇到换行符 \n(或者其他指定的分隔符),并将读取的内容存储到一个字符串中。
getline(std::istream& is, std::string& str, char delim);
//示例
#include <iostream>
...
vector<std::string> words;
string word;
stringstream ss(s);
while (getline(ss, word, ',')) { // 以逗号为分隔符提取单词
words.push_back(word);
}
- 参数说明
- is:输入流对象,可以是 std::cin、std::ifstream、std::istringstream 等。
- str:字符串对象,getline 将读取的内容存储到该字符串中。
- delim(可选):自定义分隔符,如果不指定,默认使用换行符 \n 作为分隔符。
2.10 字符判断
| 函数名 | 功能 |
|---|---|
| isalpha(char c) | 判断是否是字母 |
| islower(char c) | 判断是否是小写字母 |
| isupper(char c) | 判断是否是大写字母 |
| isdigit(char c) | 判断是否是数字 |
| isalnum(char c) | 判断是否是字母或者数字 |
| tolower(char c) | 将c转换为小写字母 |
| toupper(char c) | 将c转换为大写字母 |
2万+

被折叠的 条评论
为什么被折叠?



