Appearance
C++ vector 容器
std::vector是 C++ 标准模板库(STL)中最重要的容器之一,它是一个动态数组,可以自动调整大小。
1. vector 的基本概念
1.1 声明和初始化
cpp
#include <iostream>
#include <vector>
int main() {
// 声明空的 vector
std::vector<int> vec1;
// 声明并初始化
std::vector<int> vec2 = {1, 2, 3, 4, 5};
// 指定大小
std::vector<int> vec3(5);
// 指定大小和初始值
std::vector<int> vec4(5, 10);
// 使用另一个 vector 初始化
std::vector<int> vec5(vec2);
return 0;
}2. vector 的基本操作
2.1 添加元素
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
// 使用 push_back 添加元素
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
// 使用 emplace_back 添加元素(C++11)
vec.emplace_back(40);
vec.emplace_back(50);
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}2.2 访问元素
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 使用下标运算符
std::cout << "第一个元素: " << vec[0] << std::endl;
// 使用 at 函数(会检查边界)
std::cout << "第二个元素: " << vec.at(1) << std::endl;
// 使用 front 函数
std::cout << "第一个元素: " << vec.front() << std::endl;
// 使用 back 函数
std::cout << "最后一个元素: " << vec.back() << std::endl;
return 0;
}2.3 修改元素
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 使用下标运算符修改元素
vec[0] = 100;
// 使用 at 函数修改元素
vec.at(1) = 200;
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}2.4 删除元素
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 删除最后一个元素
vec.pop_back();
// 删除指定位置的元素
vec.erase(vec.begin() + 2);
// 删除指定范围的元素
vec.erase(vec.begin() + 1, vec.begin() + 3);
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}3. vector 的大小和容量
3.1 获取大小和容量
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 获取大小
std::cout << "大小: " << vec.size() << std::endl;
// 获取容量
std::cout << "容量: " << vec.capacity() << std::endl;
// 判断是否为空
std::cout << "是否为空: " << (vec.empty() ? "是" : "否") << std::endl;
return 0;
}3.2 调整大小
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30};
std::cout << "调整前的大小: " << vec.size() << std::endl;
// 调整大小
vec.resize(5);
std::cout << "调整后的大小: " << vec.size() << std::endl;
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}3.3 预留容量
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
// 预留容量
vec.reserve(100);
std::cout << "容量: " << vec.capacity() << std::endl;
std::cout << "大小: " << vec.size() << std::endl;
return 0;
}4. vector 的遍历
4.1 使用下标遍历
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
for (size_t i = 0; i < vec.size(); i++) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
return 0;
}4.2 使用迭代器遍历
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}4.3 使用范围 for 循环(C++11)
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}5. vector 的常用算法
5.1 排序
cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {50, 10, 40, 20, 30};
// 升序排序
std::sort(vec.begin(), vec.end());
for (int x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}5.2 查找
cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 查找元素
auto it = std::find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
std::cout << "找到元素 30" << std::endl;
} else {
std::cout << "未找到元素 30" << std::endl;
}
return 0;
}5.3 计算和
cpp
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 计算和
int sum = std::accumulate(vec.begin(), vec.end(), 0);
std::cout << "和: " << sum << std::endl;
return 0;
}6. 二维 vector
6.1 声明和初始化
cpp
#include <iostream>
#include <vector>
int main() {
// 声明二维 vector
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 遍历二维 vector
for (const auto& row : matrix) {
for (int x : row) {
std::cout << x << " ";
}
std::cout << std::endl;
}
return 0;
}7. vector 的常见操作
7.1 清空 vector
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
std::cout << "清空前的大小: " << vec.size() << std::endl;
// 清空 vector
vec.clear();
std::cout << "清空后的大小: " << vec.size() << std::endl;
return 0;
}7.2 交换两个 vector
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
std::cout << "交换前:" << std::endl;
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << "vec2: ";
for (int x : vec2) {
std::cout << x << " ";
}
std::cout << std::endl;
// 交换两个 vector
vec1.swap(vec2);
std::cout << "交换后:" << std::endl;
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << "vec2: ";
for (int x : vec2) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}8. 示例:综合运用
现在,让我们看一个综合运用各种 vector 特性的例子:
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
// 声明和初始化 vector
std::cout << "声明和初始化 vector:" << std::endl;
std::vector<int> vec1 = {10, 20, 30, 40, 50};
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << std::endl;
// 添加元素
std::cout << "添加元素:" << std::endl;
vec1.push_back(60);
vec1.emplace_back(70);
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << std::endl;
// 访问元素
std::cout << "访问元素:" << std::endl;
std::cout << "第一个元素: " << vec1.front() << std::endl;
std::cout << "最后一个元素: " << vec1.back() << std::endl;
std::cout << std::endl;
// 修改元素
std::cout << "修改元素:" << std::endl;
vec1[0] = 100;
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << std::endl;
// 删除元素
std::cout << "删除元素:" << std::endl;
vec1.pop_back();
vec1.erase(vec1.begin() + 1);
std::cout << "vec1: ";
for (int x : vec1) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << std::endl;
// 获取大小和容量
std::cout << "获取大小和容量:" << std::endl;
std::cout << "大小: " << vec1.size() << std::endl;
std::cout << "容量: " << vec1.capacity() << std::endl;
std::cout << "是否为空: " << (vec1.empty() ? "是" : "否") << std::endl;
std::cout << std::endl;
// 排序
std::cout << "排序:" << std::endl;
std::vector<int> vec2 = {50, 10, 40, 20, 30};
std::sort(vec2.begin(), vec2.end());
std::cout << "vec2: ";
for (int x : vec2) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << std::endl;
// 查找
std::cout << "查找:" << std::endl;
auto it = std::find(vec2.begin(), vec2.end(), 30);
if (it != vec2.end()) {
std::cout << "找到元素 30" << std::endl;
}
std::cout << std::endl;
// 计算和
std::cout << "计算和:" << std::endl;
int sum = std::accumulate(vec2.begin(), vec2.end(), 0);
std::cout << "和: " << sum << std::endl;
std::cout << std::endl;
// 二维 vector
std::cout << "二维 vector:" << std::endl;
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (const auto& row : matrix) {
for (int x : row) {
std::cout << x << " ";
}
std::cout << std::endl;
}
return 0;
}小结
C++ vector 容器包括:
vector 的基本概念:
- 声明和初始化 vector
- 动态数组,可以自动调整大小
vector 的基本操作:
- 添加元素:
push_back()、emplace_back() - 访问元素:下标运算符、
at()、front()、back() - 修改元素:下标运算符、
at() - 删除元素:
pop_back()、erase()
- 添加元素:
vector 的大小和容量:
- 获取大小:
size() - 获取容量:
capacity() - 判断是否为空:
empty() - 调整大小:
resize() - 预留容量:
reserve()
- 获取大小:
vector 的遍历:
- 使用下标遍历
- 使用迭代器遍历
- 使用范围 for 循环(C++11)
vector 的常用算法:
- 排序:
std::sort() - 查找:
std::find() - 计算和:
std::accumulate()
- 排序:
二维 vector:
- 声明和初始化二维 vector
- 遍历二维 vector
vector 的常见操作:
- 清空 vector:
clear() - 交换两个 vector:
swap()
- 清空 vector:
关键概念:
- vector:动态数组,可以自动调整大小
- 大小:vector 中元素的个数
- 容量:vector 可以容纳的元素个数
- 迭代器:用于遍历 vector 的对象
- 算法:STL 提供的常用算法
掌握 vector 是编写高效 C++ 程序的基础,在后续章节中,我们将学习 C++ 的数据结构。