C++中vector

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 = &num;    // int*
auto* ptr2 = &num;   // 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 类型

相关推荐
拳里剑气3 小时前
C++:string的使用
开发语言·c++·学习方法
国服第二切图仔3 小时前
Rust开发之Result枚举与?运算符简化错误传播
开发语言·python·rust
Larry_Yanan3 小时前
QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
c++·笔记·qt·学习·ui·交互
Dovis(誓平步青云)4 小时前
《静态库与动态库:从编译原理到实战调用,一篇文章讲透》
linux·运维·开发语言
Nan_Shu_6144 小时前
学习:JavaScript(1)
开发语言·javascript·学习·ecmascript
2301_803554524 小时前
c++调用客户端库与kafka交互
c++·kafka·交互
zhangx1234_4 小时前
C语言题目1
c语言·开发语言·数据结构
菜鸡儿齐4 小时前
ThreadLocal介绍
java·开发语言
国服第二切图仔4 小时前
Rust开发之自定义错误类型(实现Error trait)
开发语言·python·rust