C++ 的 vector 是标准模板库(STL)中最常用的动态数组容器。
1. 基本使用
包含头文件和初始化
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 各种初始化方式
vector<int> vec1; // 空vector
vector<int> vec2(5); // 5个元素,默认值为0
vector<int> vec3(5, 10); // 5个元素,每个都是10
vector<int> vec4 = {1, 2, 3, 4, 5}; // 初始化列表
vector<int> vec5(vec4); // 拷贝构造
return 0;
}
2. 添加和删除元素
添加元素
cpp
vector<int> vec;
// 在末尾添加元素
vec.push_back(10); // vec: [10]
vec.push_back(20); // vec: [10, 20]
vec.push_back(30); // vec: [10, 20, 30]
// 在指定位置插入元素
vec.insert(vec.begin(), 5); // 在开头插入: [5, 10, 20, 30]
vec.insert(vec.begin() + 2, 15); // 在索引2插入: [5, 10, 15, 20, 30]
// 使用 emplace_back (C++11更高效)
vec.emplace_back(40); // 在末尾直接构造元素
删除元素
cpp
vector<int> vec = {10, 20, 30, 40, 50};
// 删除末尾元素
vec.pop_back(); // 删除50: [10, 20, 30, 40]
// 删除指定位置元素
vec.erase(vec.begin()); // 删除开头: [20, 30, 40]
vec.erase(vec.begin() + 1); // 删除索引1: [20, 40]
// 删除指定范围
vec = {10, 20, 30, 40, 50};
vec.erase(vec.begin() + 1, vec.begin() + 3); // 删除[20,30]: [10,40,50]
// 清空所有元素
vec.clear(); // vec: []
3. 访问元素
cpp
vector<int> vec = {10, 20, 30, 40, 50};
// 使用下标访问(不检查边界)
cout << vec[0] << endl; // 10
cout << vec[2] << endl; // 30
vec[1] = 25; // 修改元素: [10,25,30,40,50]
// 使用 at() 访问(检查边界,越界抛出异常)
cout << vec.at(0) << endl; // 10
// cout << vec.at(10) << endl; // 抛出 std::out_of_range 异常
// 访问首尾元素
cout << vec.front() << endl; // 第一个元素: 10
cout << vec.back() << endl; // 最后一个元素: 50
// 获取底层数组指针
int* data = vec.data();
cout << data[0] << endl; // 10
4. 容量和大小操作
cpp
vector<int> vec = {10, 20, 30};
// 大小相关
cout << "大小: " << vec.size() << endl; // 3
cout << "容量: " << vec.capacity() << endl; // 可能大于3
cout << "是否为空: " << vec.empty() << endl; // 0 (false)
// 调整大小
vec.resize(5); // 大小变为5,新元素默认初始化为0: [10,20,30,0,0]
vec.resize(3); // 大小变为3,删除多余元素: [10,20,30]
vec.resize(6, 99); // 大小变为6,新元素初始化为99: [10,20,30,99,99,99]
// 容量管理
vec.reserve(100); // 预分配容量为100,避免多次重新分配
cout << "容量: " << vec.capacity() << endl; // 100
// 缩减容量以匹配大小
vec.shrink_to_fit(); // 请求减少容量到刚好容纳元素
5. 遍历 vector
cpp
vector<int> vec = {10, 20, 30, 40, 50};
// 1. 使用下标遍历
for (size_t i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 2. 使用迭代器遍历
for (auto it = vec.begin(); it != vec.end(); it++) {
cout << *it << " "; // 正向输出: 10 20 30 40 50
}
cout << endl;
// 3. 使用范围for循环 (C++11推荐)
for (const auto& element : vec) {
cout << element << " ";
}
cout << endl;
// 4. 使用反向迭代器
for (auto it = vec.rbegin(); it != vec.rend(); it++) {
cout << *it << " "; // 反向输出: 50 40 30 20 10
}
cout << endl;
6. 二维 vector(矩阵)
cpp
// 创建 3x4 的二维vector,初始值为0
vector<vector<int>> matrix(3, vector<int>(4, 0));
// 初始化二维vector
vector<vector<int>> matrix2 = {
{1, 2, 3, 100},
{4, 5, 6, 100},
{7, 8, 9, 100}
};
// 访问元素
cout << matrix2[1][2] << endl; // 6
// 遍历二维vector
for (size_t i = 0; i < matrix2.size(); i++) {
for (size_t j = 0; j < matrix2[i].size(); j++) {
cout << matrix2[i][j] << " ";
}
cout << endl;
}
// 使用范围for循环遍历
for (const auto& row : matrix2) {
for (const auto& element : row) {
cout << element << " ";
}
cout << endl;
}
7. 算法操作
cpp
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {50, 20, 80, 30, 10};
// 排序
sort(vec.begin(), vec.end()); // [10,20,30,50,80]
// 反转
reverse(vec.begin(), vec.end()); // [80,50,30,20,10]
// 查找
auto it = find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
cout << "找到30,位置: " << distance(vec.begin(), it) << endl;
}
// 统计
int count = count_if(vec.begin(), vec.end(), [](int x) {
return x > 25;
});
cout << "大于25的元素个数: " << count << endl;
// 删除重复元素(需要先排序)
vec = {10, 20, 20, 30, 30, 30};
sort(vec.begin(), vec.end()); // [10, 20, 20, 30, 30, 30]
auto last = unique(vec.begin(), vec.end());
vec.erase(last, vec.end()); // [10,20,30]
return 0;
}
8. 实际应用示例
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Student {
string name;
int score;
Student(string n, int s) : name(n), score(s) {}
};
int main() {
vector<Student> students;
// 添加学生
students.emplace_back("Alice", 85);
students.emplace_back("Bob", 92);
students.emplace_back("Charlie", 78);
students.push_back(Student("David", 88));
// 按成绩排序
sort(students.begin(), students.end(),
[](const Student& a, const Student& b) {
return a.score > b.score;
});
// 输出排名
cout << "成绩排名:" << endl;
for (size_t i = 0; i < students.size(); i++) {
cout << i + 1 << ". " << students[i].name
<< " - " << students[i].score << "分" << endl;
}
// 计算平均分
int total = 0;
for (const auto& student : students) {
total += student.score;
}
double average = static_cast<double>(total) / students.size();
cout << "平均分: " << average << endl;
return 0;
}
8.1auto变量用法
cpp
#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;
//000000000000
auto x1 = 10; // int
auto x2 = 10.0; // double
auto x3 = 'A'; // char
auto x4 = "Hello"; // const char*
auto x5 = string("Hello"); // string
// 引用和const
int num = 100;
auto y1 = num; // int (值拷贝)
auto& y2 = num; // int& (引用)
const auto& y3 = num; // const int& (常量引用)
// 指针
auto ptr1 = # // int*
auto* ptr2 = # // int* (显式指针)
//111111.代替显式类型声明
int main() {
// 基本类型推导
auto i = 42; // int
auto d = 3.14; // double
auto c = 'A'; // char
auto s = "Hello"; // const char*
auto b = true; // bool
// 复杂类型推导
auto v = vector<int>{1, 2, 3}; // vector<int>
auto m = map<string, int>(); // map<string, int>
return 0;
}
//222222.在循环中使用,遍历容器
vector<int> numbers = {1, 2, 3, 4, 5};
// 只读遍历
for (const auto& num : numbers) {
cout << num << " ";
}
cout << endl;
// 可修改遍历
for (auto& num : numbers) {
num *= 2; // 可以修改元素
}
// 值拷贝遍历(不推荐用于大对象)
for (auto num : numbers) {
cout << num << " ";
}
cout << endl;
//333333.与迭代器配合使用
vector<string> names = {"Alice", "Bob", "Charlie"};
// 自动推导迭代器类型
for (auto it = names.begin(); it != names.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 反向迭代器
for (auto rit = names.rbegin(); rit != names.rend(); rit++) {
cout << *rit << " ";
}
cout << endl;
// 在算法中使用
auto found = find(names.begin(), names.end(), "Bob");
if (found != names.end()) {
cout << "找到: " << *found << endl;
}
8.2 static_cast 用法
static_cast 是 C++ 中的静态类型转换运算符,用于在编译时进行明确的类型转换。
double average = static_cast<double>(total) / students.size();表示将int变量 total 从原来的类型转换为 double 类型