Skip to content

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 容器包括:

  1. vector 的基本概念

    • 声明和初始化 vector
    • 动态数组,可以自动调整大小
  2. vector 的基本操作

    • 添加元素:push_back()emplace_back()
    • 访问元素:下标运算符、at()front()back()
    • 修改元素:下标运算符、at()
    • 删除元素:pop_back()erase()
  3. vector 的大小和容量

    • 获取大小:size()
    • 获取容量:capacity()
    • 判断是否为空:empty()
    • 调整大小:resize()
    • 预留容量:reserve()
  4. vector 的遍历

    • 使用下标遍历
    • 使用迭代器遍历
    • 使用范围 for 循环(C++11)
  5. vector 的常用算法

    • 排序:std::sort()
    • 查找:std::find()
    • 计算和:std::accumulate()
  6. 二维 vector

    • 声明和初始化二维 vector
    • 遍历二维 vector
  7. vector 的常见操作

    • 清空 vector:clear()
    • 交换两个 vector:swap()

关键概念:

  • vector:动态数组,可以自动调整大小
  • 大小:vector 中元素的个数
  • 容量:vector 可以容纳的元素个数
  • 迭代器:用于遍历 vector 的对象
  • 算法:STL 提供的常用算法

掌握 vector 是编写高效 C++ 程序的基础,在后续章节中,我们将学习 C++ 的数据结构。