1. 基础概念
1.1 vector是什么,它与数组的区别
vector 是 C++ 标准模板库(STL)中的一种序列容器,它可以被看作是一个动态大小的数组。下面是对 vector 和传统数组的基本介绍,以及它们之间的主要区别:
Vector
类型安全:
vector 是泛型的,可以存储任意类型的元素,例如 vector, vector 等。
内存管理:
vector 在内部自动处理内存分配和释放,使得使用更加方便。
附加功能:
提供了丰富的成员函数,如 push_back(), pop_back(), insert(), erase() 等,方便操作元素。
迭代器支持:
支持迭代器,可以与 STL 算法一起使用。
数组
固定大小:
数组的大小在声明时确定,之后不能改变。
类型特定:
数组只能存储声明时指定的类型。
内存管理:
数组不会自动处理内存分配和释放,需要程序员手动处理动态分配的数组(如使用 new 和 delete)。
直接访问:
提供了直接通过索引访问元素的简单方式。
效率:
在某些情况下,由于没有动态大小的开销,数组可能比 vector 更高效。
主要区别
大小灵活性:
vector 可以在运行时改变大小,而数组的大小在编译时固定。
易用性:
vector 提供了更多的辅助函数和自动的内存管理,使得它在使用上更为方便。
性能:
对于固定大小的数据集,数组可能更有效率;但当需要动态大小时,vector 的优势更明显。
安全性:
vector 的成员函数如 at() 提供边界检查,而数组则没有这样的安全性保障。
1.2 总结
总的来说,vector 提供了更多的灵活性和安全性,尤其是在处理大小可变的数据集时。而数组在处理固定大小和类型的数据时可能更为高效。
2. Vector基本操作
2.1 包含头文件
要在 C++ 程序中使用 vector,需要包含 C++ 标准模板库中的 头文件。这样做可以访问 std::vector 类。
在 C++ 源文件的开始部分,添加以下预处理器指令:
#include <vector>
一旦包含了 头文件,就可以在程序中声明和使用 vector 类型了。这里是一个基本的使用示例:
#include <iostream> #include <vector> int main() { // 创建一个 int 类型的 vector std::vector<int> myVector; // 向 vector 添加元素 myVector.push_back(10); myVector.push_back(20); // 遍历 vector 并打印元素 for (int elem : myVector) { std::cout << elem << std::endl; } return 0; }
在这个示例中,首先包含了 和 头文件,然后在 main 函数中创建了一个类型为 int 的 vector。我们向这个 vector 中添加了一些元素,并使用范围基 for 循环遍历并打印这些元素。
记住,vector 是在 std 命名空间中定义的,所以需要使用 std::vector 来引用它,除非使用了 using namespace std; 语句。不过,出于代码清晰性和避免命名冲突的考虑,建议直接使用 std:: 前缀。
2.2 声明和初始化
在 C++ 中,声明一个 vector 需要指定其存储元素的类型。vector 是模板类,因此可以声明任何类型的 vector。以下是 vector 声明的基本语法及一些常见示例。
声明
std::vector<ElementType> vectorName;
ElementType 是你打算在 vector 中存储的数据类型。
vectorName 是你给 vector 命名的名称。
示例:
声明一个整数类型的 vector:
std::vector<int> myIntVector;
声明一个双精度浮点数类型的 vector:
std::vector<double> myDoubleVector;
声明一个字符串类型的 vector:
std::vector<std::string> myStringVector;
声明一个自定义类型的 vector (例如,假设有一个 Employee 类):
std::vector<Employee> myEmployeeVector;
初始化
除了基本的声明之外,vector 也可以在声明时进行初始化。
默认初始化 (创建一个空的 vector):
std::vector<int> myVector;
初始化为特定大小 (例如,大小为 10):
std::vector<int> myVector(10);
初始化为特定大小并赋予初始值 (例如,10 个元素,每个元素的值为 0):
std::vector<int> myVector(10, 0);
使用初始化列表:
std::vector<int> myVector = {1, 2, 3, 4, 5};
2.3 访问元素
在 C++ 中,vector 提供了多种方法来访问其元素。最常用的方法包括使用下标运算符 [] 和成员函数 at(),以及通过迭代器。下面是每种方法的详细介绍:
使用下标运算符 []
这是访问 vector 元素最直接的方法。语法类似于数组,使用索引来访问元素。下标从 0 开始,最大为 vector 的大小减一。使用下标运算符时,不会进行边界检查,因此超出范围的访问可能导致未定义行为。
std::vector<int> v = {10, 20, 30, 40}; std::cout << v[2]; // 输出第三个元素,结果为 30
使用成员函数 at()
at() 方法提供了边界检查。如果索引超出范围,它会抛出一个 std::out_of_range 异常。这种方法比 [] 运算符更安全,特别是在调试阶段。
std::vector<int> v = {10, 20, 30, 40}; std::cout << v.at(2); // 输出第三个元素,结果为 30 try { std::cout << v.at(4); // 超出范围,将抛出异常 } catch (const std::out_of_range& e) { std::cerr << "Error: " << e.what() << std::endl; }
使用迭代器
vector 支持迭代器,这是一种更通用和灵活的访问方式。迭代器可以用来遍历 vector 的所有元素。
std::vector<int> v = {10, 20, 30, 40}; for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it << std::endl; // 输出当前元素 }
使用范围基 for 循环(C++11 及以后版本)
这是一种简洁的遍历 vector 的方法。自动处理迭代和访问。
std::vector<int> v = {10, 20, 30, 40}; for (int num : v) { std::cout << num << std::endl; // 输出当前元素 }
注意事项
在使用下标运算符 [] 时,要确保不会访问超出 vector 范围的元素。
如果程序的健壮性是首要考虑,使用 at() 方法更为安全,因为它会进行边界检查。
使用迭代器或范围基 for 循环可以更加优雅地遍历 vector。
2.4 修改元素
在 C++ 中,vector 提供了多种方式来修改其元素。这些方法包括直接访问和修改特定元素、添加新元素、删除现有元素,以及其他更复杂的操作。以下是这些方法的详细介绍:
c++ vector数组详细介绍(二)https://developer.aliyun.com/article/1437017?spm=a2c6h.13262185.profile.52.5bba685cuSQkDD
c++ vector数组详细介绍(三)https://developer.aliyun.com/article/1437019?spm=a2c6h.13262185.profile.51.5bba685cuSQkDD