vector知识点简介

vector 是 C++ 标准模板库(STL)中的一个容器类,表示一个动态数组。与普通的 C++ 数组相比,vector 的大小是可动态调整的,且提供了许多有用的功能和方法。

基本用法

  1. 声明和初始化:
vector<int> v; // 声明一个空的整数向量
vector<int> v(5); // 声明一个有5个元素的整数向量,初始值为0
vector<int> v(5, 10); // 声明一个有5个元素的整数向量,初始值为10
vector<int> v = {1, 2, 3, 4, 5}; // 用初始化列表初始化向量
  1. 访问元素:
v[0] = 10; // 通过下标访问元素,向量的第一个元素被赋值为10
int x = v[1]; // 获取向量的第二个元素
int y = v.at(2); // 通过at()方法获取第三个元素,带边界检查
  1. 向量大小:
int size = v.size(); // 获取向量的大小(元素个数)
  1. 添加和删除元素:
v.push_back(20); // 在向量末尾添加一个元素
v.pop_back(); // 删除向量末尾的元素
  1. 遍历向量:
for(int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
}

// 使用范围for循环
for(int x : v) {
    cout << x << " ";
}
  1. 插入和删除特定位置的元素:
v.insert(v.begin() + 1, 15); // 在第二个位置插入15
v.erase(v.begin() + 2); // 删除第三个位置的元素
  1. 清空向量:
v.clear(); // 清空所有元素

示例代码

下面是一个完整的示例,展示了如何使用 vector 来解决两数之和问题,并使用它来操作一个整数向量:

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {}; // 返回空向量,表示没有找到结果
    }
};

int main() {
    // 定义一个向量并初始化
    vector<int> nums = {2, 7, 11, 15};
    int target = 9;
    
    // 创建 Solution 对象并调用 twoSum 方法
    Solution sol;
    vector<int> result = sol.twoSum(nums, target);

    // 输出结果
    if (!result.empty()) {
        cout << "Indices: " << result[0] << ", " << result[1] << endl;
    } else {
        cout << "No solution found." << endl;
    }

    return 0;
}

代码解释

  1. vector<int> nums = {2, 7, 11, 15};:定义了一个整数向量 nums,并用 {2, 7, 11, 15} 初始化它。
  2. Solution sol;:创建一个 Solution 类的实例 sol
  3. vector<int> result = sol.twoSum(nums, target);:调用 twoSum 方法,将 numstarget 传入,并返回一个结果向量 result
  4. if (!result.empty()):检查返回的向量是否为空。如果非空,则输出结果索引;否则输出没有找到解决方案。

使用 vector 能使你在C++中方便地操作动态数组,支持各种常用的操作,并且是标准模板库中非常常用的容器之一。

vector 是 C++ 标准模板库(STL)中最常用的容器之一。它是一个动态数组,可以根据需要调整大小,并提供了一系列强大的方法来操作数据。以下是一些 vector 的高级用法和知识,以及一些示例代码:

1. 向量的创建和初始化

#include <vector>
using namespace std;

vector<int> vec1; // 创建一个空向量
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); // 拷贝构造函数

2. 访问和修改元素

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 访问元素
    cout << "First element: " << vec[0] << endl;
    cout << "Second element: " << vec.at(1) << endl; // 使用at()方法,带边界检查

    // 修改元素
    vec[0] = 10;
    vec.at(1) = 20;

    // 输出修改后的向量
    for (int i : vec) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

3. 动态调整大小

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 3};

    vec.push_back(4); // 在向量末尾添加元素
    vec.push_back(5);

    vec.pop_back(); // 删除向量末尾的元素

    cout << "Size: " << vec.size() << endl; // 获取向量大小

    vec.resize(10); // 将向量大小调整为10
    cout << "New size: " << vec.size() << endl;

    vec.clear(); // 清空向量
    cout << "Size after clear: " << vec.size() << endl;

    return 0;
}

4. 插入和删除元素

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 插入元素
    vec.insert(vec.begin() + 2, 10); // 在第三个位置插入10

    // 删除元素
    vec.erase(vec.begin() + 3); // 删除第四个位置的元素

    // 输出修改后的向量
    for (int i : vec) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

5. 遍历向量

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 使用索引遍历
    for (size_t i = 0; i < vec.size(); ++i) {
        cout << vec[i] << " ";
    }
    cout << endl;

    // 使用范围for循环遍历
    for (int i : vec) {
        cout << i << " ";
    }
    cout << endl;

    // 使用迭代器遍历
    for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

6. 其他有用的方法

  • capacity(): 返回向量在不重新分配内存的情况下可以包含的元素个数。
  • empty(): 如果向量为空,返回 true
  • reserve(size_type n): 预留存储空间至少可以包含 n 个元素,而不改变向量的大小。
  • shrink_to_fit(): 减少向量的容量以适应其大小。
  • assign(): 用新内容替换向量中的内容。

示例

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec;

    vec.reserve(10); // 预留空间,防止多次重新分配内存

    vec.assign(5, 100); // 用5个100替换向量中的内容

    cout << "Size: " << vec.size() << endl;
    cout << "Capacity: " << vec.capacity() << endl;

    vec.shrink_to_fit(); // 调整容量以适应实际大小

    cout << "New capacity: " << vec.capacity() << endl;

    // 输出向量内容
    for (int i : vec) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

这些示例展示了 vector 的常用功能和高级用法。vector 是一个非常灵活和强大的容器,能够满足大多数动态数组的需求。在使用 vector 时,理解其容量和大小管理机制,以及各种成员函数的用法,可以使你的程序更高效、更易维护。

using namespace std; 是 C++ 语言中的一条指令,它的作用是让程序在使用 std(标准命名空间)中的对象或函数时,不需要显式地加上 std:: 前缀。例如,cout 可以直接写成 cout 而不是 std::cout

下面我们详细解释每一句代码:


完整代码

#include <iostream> 
#include <vector>

using namespace std;

int main() {
    // 创建一个 3x4 的二维 vector,初始值为 0
    vector<vector<int>> matrix(3, vector<int>(4, 0));

    // 赋值
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            matrix[i][j] = i * 10 + j;
        }
    }

    // 输出
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }

    return 0;
}

逐行解释

1. 头文件引入

#include <iostream> 
#include <vector>
  • #include <iostream>:引入 C++ 的标准输入输出流库,用于 coutcin 等操作。
  • #include <vector>:引入 vector 头文件,提供动态数组(向量)功能。

2. 命名空间

using namespace std;
  • std::vectorstd::cout 等标准库组件可以直接使用,无需加 std:: 前缀。
  • 如果不使用这句代码,那么 cout 需要写成 std::coutvector 需要写成 std::vector

3. main 函数

int main() {
  • main() 是 C++ 程序的入口,程序执行从这里开始。

4. 创建一个二维 vector

vector<vector<int>> matrix(3, vector<int>(4, 0));
  • vector<vector<int>> matrix:定义一个二维 vector,可以看作是一个动态的二维数组。
  • matrix(3, vector<int>(4, 0))
  • 创建 3 行,每行是一个 vector<int>,大小为 4,初始值为 0。
  • 相当于 int matrix[3][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}};,但 vector 可以动态扩展。

5. 赋值(填充矩阵)

for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < 4; ++j) {
        matrix[i][j] = i * 10 + j;
    }
}
  • 通过两层 for 循环遍历 matrix,并对每个元素赋值。
  • 赋值规则:matrix[i][j] = i * 10 + j;
  • 例如:
  • matrix[0][0] = 0 * 10 + 0 = 0
  • matrix[1][2] = 1 * 10 + 2 = 12
  • matrix[2][3] = 2 * 10 + 3 = 23
  • 结果是:
0   1   2   3
10  11  12  13
20  21  22  23

6. 遍历并输出二维数组

for (const auto& row : matrix) {
    for (int val : row) {
        cout << val << " ";
    }
    cout << endl;
}

外层 for 循环

for (const auto& row : matrix)
  • auto& row:使用 auto 让编译器推导 row 的类型,& 表示引用,避免拷贝,提高效率。
  • row 代表 matrix 中的一行,即 vector<int> 类型。

内层 for 循环

for (int val : row)
  • val 遍历 row 中的每个元素,并输出。

cout << val << " ";

  • 输出当前元素,后面加一个空格,使其格式化输出。

cout << endl;

  • 每打印完一行后换行。

7. 结束 main 函数

return 0;
  • return 0; 表示程序成功结束。

最终输出

0 1 2 3 
10 11 12 13 
20 21 22 23
  • 3 行 4 列的矩阵被正确输出。

总结

  1. vector<vector<int>> matrix(3, vector<int>(4, 0));
  • 创建 3×4 的二维 vector,初始值为 0
  1. 双重 for 循环填充数据
  2. 使用范围 for 遍历输出矩阵
  3. using namespace std; 让代码更简洁,但在大型项目中建议使用 std:: 以避免命名冲突。

当然!下面是几个使用 vector 存储二维数组的不同示例,包括不同的初始化方式、动态调整大小等。


示例 1:创建一个 m × n 的二维 vector 并手动输入数据

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int m, n;
    cout << "请输入矩阵的行数和列数:";
    cin >> m >> n;

    // 创建 m x n 的二维 vector
    vector<vector<int>> matrix(m, vector<int>(n));

    // 读取用户输入
    cout << "请输入矩阵的元素:" << endl;
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 输出矩阵
    cout << "输入的矩阵是:" << endl;
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }

    return 0;
}

说明:

  • 用户可以输入 mn,然后输入 m × n 个元素,存入 vector 并打印。
  • 适用于动态创建矩阵的情况。

示例 2:不同大小的行(非规则矩阵)

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<int>> matrix;

    // 第一行有 3 个元素
    matrix.push_back({1, 2, 3});

    // 第二行有 5 个元素
    matrix.push_back({4, 5, 6, 7, 8});

    // 第三行有 2 个元素
    matrix.push_back({9, 10});

    // 输出不规则矩阵
    cout << "非规则矩阵:" << endl;
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }

    return 0;
}

输出

非规则矩阵:
1 2 3 
4 5 6 7 8 
9 10

说明

  • 这里的 vector 并非严格的 m × n 形状,而是变长的每一行
  • push_back({}) 直接向 vector 添加一整行。

示例 3:动态调整矩阵大小

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<int>> matrix(2, vector<int>(2, 1)); // 2x2 矩阵,初始值为 1

    // 输出原始矩阵
    cout << "原始矩阵:" << endl;
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }

    // 添加新的一行
    matrix.push_back({3, 3, 3});

    // 在第一行增加一个元素
    matrix[0].push_back(2);

    // 输出调整后的矩阵
    cout << "调整后的矩阵:" << endl;
    for (const auto& row : matrix) {
        for (int val : row) {
            cout << val << " ";
        }
        cout << endl;
    }

    return 0;
}

输出

原始矩阵:
1 1 
1 1 
调整后的矩阵:
1 1 2 
1 1 
3 3 3

说明

  • matrix.push_back({3, 3, 3}) 在最后增加了一行。
  • matrix[0].push_back(2) 在第一行末尾添加 2

示例 4:使用指针访问 vector 存储的二维数组

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 使用指针遍历
    for (const auto& row : matrix) {
        for (const int* ptr = &row[0]; ptr < &row[0] + row.size(); ++ptr) {
            cout << *ptr << " ";
        }
        cout << endl;
    }

    return 0;
}

输出

1 2 3 
4 5 6 
7 8 9

说明

  • &row[0] 获取当前行的首地址,ptr++ 访问该行的元素,类似 C 风格数组。

示例 5:转换 vector<vector<int>>vector<int>

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    vector<int> flatMatrix;
    
    // 展平 2D 矩阵到 1D 数组
    for (const auto& row : matrix) {
        flatMatrix.insert(flatMatrix.end(), row.begin(), row.end());
    }

    // 输出展平后的矩阵
    cout << "展平后的矩阵:" << endl;
    for (int val : flatMatrix) {
        cout << val << " ";
    }

    return 0;
}

输出

展平后的矩阵:
1 2 3 4 5 6 7 8 9

说明

  • insert(flatMatrix.end(), row.begin(), row.end())row 添加到 flatMatrix 末尾。
  • 适用于某些算法需要 1D 数组时的情况。

总结

示例说明
示例 1用户输入 m × n 的二维 vector
示例 2不规则矩阵,每行大小不同
示例 3动态调整矩阵大小
示例 4用指针遍历 vector
示例 5将二维 vector 展平为一维 vector

1人评论了“vector知识点简介”

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部