C&C++
C&C++
STL
Vector 连续动态数组
特性
- 动态大小:vector 的大小可根据元素数量的增减自动调整,无需手动管理内存
- 连续存储:元素在内存中连续存储,类似于内置数组,因此支持通过索引进行快速随机访问
- 自动内存管理:vector 自动处理内存的分配和释放,减少了内存泄漏的风险
- 类型安全:作为模板类,vector 可以存储任意类型的元素(内置类型、对象、指针等),并在编译时进行类型检查
初始化
| 初始化方式 | 示例代码 | 说明 |
|---|---|---|
| 默认构造 | std::vector<int> vec1; |
创建空的 vector,动态添加 |
| 指定大小 | std::vector<int> vec2(5); |
5 个元素,默认初始化为 0 |
| 指定大小和初始值 | std::vector<int> vec3(5, 10); |
5 个元素,每个都初始化为 10 |
| 初始化列表 | std::vector<int> vec4 = {1, 2, 3, 4, 5}; |
使用花括号初始化列表或表示列表 |
| 拷贝构造 | std::vector<int> vec5(vec4); |
用另一个 vector 初始化 |
元素访问
| 方法 | 示例代码 | 特点 |
|---|---|---|
at() |
int element = vec.at(1); |
进行边界检查,如果索引越界会抛出 std::out_of_range异常,更安全。 |
front() |
int first = vec.front(); |
访问第一个元素。 |
back() |
int last = vec.back(); |
访问最后一个元素。 |
添加元素
| 方法 | 示例代码 | 特点 |
|---|---|---|
push_back() |
vec.push_back(10); |
将元素(通过拷贝或移动)添加到末尾。 |
emplace_back() |
vec.emplace_back(10); |
(C++11) 更高效,直接在容器尾部构造元素,避免创建临时对象,节省拷贝开销。 |
insert() |
vec.insert(vec.begin() + 1, 20); |
在指定迭代器位置插入元素。注意:在中间插入会导致元素移动,时间复杂度为 O(n)。 |
删除元素
| 方法 | 示例代码 | 特点 |
|---|---|---|
pop_back() |
vec.pop_back(); |
删除末尾元素,时间复杂度 O(1)。 |
erase() |
vec.erase(vec.begin() + 1); |
删除指定位置的元素或范围。注意:在中间删除会导致元素移动,时间复杂度 O(n)。 |
clear() |
vec.clear(); |
清空所有元素,但不会释放容量(capacity保持不变)。 |
大小与容量
| 方法 | 示例代码 | 说明 |
|---|---|---|
size() |
size_t num = vec.size(); |
返回当前元素个数。 |
capacity() |
size_t cap = vec.capacity(); |
返回当前已分配的内存空间能容纳的元素数量(≥ size)。 |
empty() |
bool is_empty = vec.empty(); |
检查 vector 是否为空。 |
reserve(n) |
vec.reserve(100); |
预分配内存。提前分配至少能容纳 n 个元素的空间,避免多次扩容,提升性能。 |
遍历方法
1 | std::vector<int> vec = {1, 2, 3, 4, 5}; |
与STL结合
1 |
|
Stack
初始化
| 操作 | 说明 | 示例代码 | 注意事项 |
|---|---|---|---|
push(value) |
将元素压入栈顶 | myStack.push(10); |
|
pop() |
移除栈顶元素 | myStack.pop(); |
不返回被移除的元素值,需先通过 top()获取。 |
top() |
返回栈顶元素的引用 | int topElement = myStack.top(); |
在空栈上调用会导致未定义行为。 |
empty() |
检查栈是否为空 | if (myStack.empty()) { ... } |
空返回 true,否则返回 false。 |
size() |
返回栈中元素个数 | std::cout << myStack.size(); |
Unordered_map
初始化
1 | std::unordered_map<std::string, int> ageMap; |
插入元素
1 | // 方法1: 使用下标操作符[] (如果键已存在,则会更新值) |
访问与查找元素
1 | // 查找元素是否存在 (推荐安全查找方式) |
删除元素
1 | // 通过键删除元素 |
遍历元素
1 | // 方法1: 使用范围for循环 (C++11) |
其他操作
1 | // 获取大小 |
数组类键
1 |
|
Pair
初始化
| 初始化方式 | 示例 | 说明 |
|---|---|---|
| 直接构造 | std::pair<int, std::string> p(42, "Hello"); |
在构造函数中直接提供两个值。 |
使用 make_pair |
auto p = std::make_pair(42, "Hello"); |
借助函数模板推导类型,通常更简洁。 |
| 列表初始化 | std::pair<int, std::string> p = {42, "Hello"}; |
使用花括号(C++11起)。 |
| 默认构造后赋值 | std::pair<int, std::string> p; p.first = 42; p.second = "Hello"; |
先创建对象,再分别赋值。 |
String
特性
- 自动内存管理:无需手动分配和释放内存。
- 动态大小调整:可根据内容自动调整存储空间。
- 丰富的成员函数:支持查找、替换、插入、删除等多种操作。
- 边界安全检查:例如
at()方法会在越界时抛出异常。 - 运算符重载:支持使用
+(连接)、==(比较) 等直观运算符。 - 兼容 C 风格字符串:可通过
c_str()方法转换为const char*。
运算符重载 + 构造函数
1 |
|
初始化
| 初始化方式 | 说明 | 示例 |
|---|---|---|
string() |
默认构造,创建空字符串 "" |
string s1; |
string(const char* s) |
用 C 风格字符串构造 | string s2("Hello"); |
string(const string& str) |
拷贝构造函数 | string s3(s2); |
string(size_t n, char c) |
用 n个字符 c构造 |
string s4(5, 'A'); // "AAAAA" |
string(const char* s, size_t n) |
用 C 字符串的前 n个字符构造 |
string s5("Hello", 2); // "He" |
字符串连接
1 | string s1 = "Hello"; |
长度
1 | string str = "C++ String"; |
访问字符
1 | string str = "ABCDE"; |
常用成员函数
| 函数声明 | 功能说明 | 示例 |
|---|---|---|
bool empty() const |
检查字符串是否为空(长度为0) | if (str.empty()) { /* ... */ } |
void clear() |
清空字符串(长度变为0,但容量capacity可能不变) | str.clear(); |
char& front() |
访问第一个字符 | char first = str.front(); |
char& back() |
访问最后一个字符 | char last = str.back(); |
void push_back(char c) |
在字符串末尾追加字符 c |
str.push_back('!'); |
string& append(const string& str) |
在字符串末尾追加另一个字符串或子串 | str.append("!!!");或 str.append(s2, 1, 3); |
string& insert(size_t pos, const string& str) |
在指定位置 pos插入字符串 |
str.insert(5, " inserted "); |
string& erase(size_t pos = 0, size_t len = npos) |
从指定位置 pos开始删除 len个字符(若不指定 len或 len为 npos,则删除直到末尾) |
str.erase(5, 3);// 从位置5开始删除3个字符 |
void swap(string& other) |
交换两个字符串的内容 | str1.swap(str2); |
字符串操作
提取子串
1 | string str = "Hello, C++"; |
查找子串或字符
1 | string str = "C++ is powerful and C++ is fast"; |
数值转换
1 | // 字符串 → 数值 |
与 C 风格字符串的转换
1 | // C 风格字符串 → std::string |
遍历
1 | string str = "Hello"; |
自定义比较函数
函数指针
1 |
|
Lambda
1 |
|
函数对象
拥有自己的成员变量,自定义比较方式或进行记录
1 |
|
关键点
栈与堆
- ListNode node(1) VS ListNode *node = new ListNode(1)
- 栈空间与堆空间的分配问题
输入输出
- cin:基本输入操作,它会自动跳过空白字符(如空格、制表符、换行符)
- getline:读取包含空格的整行文本
- 通过
cin.ignore()忽略换行符
1 | // 循环直到文件结束 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ascendira!




