C++ 标准库 vector(三十七)
1. vector 的基本概念
-
容器的概念
vector 表示一组相同类型对象的集合,每个对象都有一个与之对应的索引,允许使用下标进行随机访问。这种结构也被称为“动态数组”,因为它可以根据需要自动调整大小。 -
类模板
vector 是一个类模板。模板是一份描述如何生成类或函数的说明,编译器根据你提供的类型参数实例化出具体的 vector 类型。例如:vector<int> ivec; // 生成保存 int 类型对象的 vector vector<Sales_item> sales_vec; // 生成保存 Sales_item 类型对象的 vector vector<vector<string>> file; // 生成保存 vector<string> 类型对象的 vector
在上述例子中,编译器根据 vector 模板分别生成了 vector、vector<Sales_item> 和 vector<vector> 三种类型。
-
模板的实例化
当你在代码中写下vector<T>
时,实际上是在告诉编译器:“请根据模板 vector 生成一个专门用于存放 T 类型对象的容器。”这称为模板实例化。需要注意的是,vector 可以容纳绝大多数类型的对象作为其元素,但由于引用不是对象,因此不能有包含引用的 vector。
2. 使用 vector 前的准备
在使用 vector 时,需要包含适当的头文件,并使用 using 声明将其引入当前作用域。常见的准备工作如下:
#include <vector>
using std::vector;
这样,在后续代码中就可以直接使用 vector,而不必每次写 std::vector
。
3. vector 的使用示例
3.1 定义和初始化 vector 对象
下面展示一些常见的 vector 定义与初始化方法:
#include <vector>
#include <string>
#include <iostream>
using std::vector;
using std::string;
using std::cout;
using std::endl;
int main() {
// 定义一个保存 int 的 vector,初始为空
vector<int> ivec;
// 定义一个保存 string 的 vector,并使用 initializer_list 进行初始化
vector<string> svec = {"hello", "world", "!"};
// 定义一个保存 Sales_item 的 vector(假设 Sales_item 已经定义)
// vector<Sales_item> sales_vec;
// 定义一个嵌套的 vector:保存 vector<string> 的 vector
vector<vector<string>> file;
// 输出 svec 中的每个元素
for (const auto &s : svec)
cout << s << " ";
cout << endl;
return 0;
}
3.2 注意事项
-
元素类型的要求
vector 能容纳绝大多数内置类型和类类型,但不能存储引用类型,因为引用不是对象。 -
嵌套容器
vector 的元素可以是另一个 vector,这样可以实现二维数组的效果。但需要注意早期 C++ 版本在嵌套模板类型时要求在右尖括号之间加空格,而 C++11 后允许直接写成vector<vector<int>>
。 -
动态大小调整
vector 会根据元素的插入或删除自动调整大小,因此在使用时无需担心内存的重新分配问题(但需要注意性能影响)。
4. 总结
-
vector 是动态数组容器:
用于存放一系列相同类型的对象,并提供随机访问功能。 -
vector 是类模板:
使用时需提供类型参数,编译器根据模板生成具体类型,如vector<int>
、vector<string>
等。 -
使用前准备:
包含头文件<vector>
并使用using std::vector;
可简化代码书写。 -
注意事项:
- vector 的元素类型必须是对象(引用不可用)。
- 嵌套使用时,C++11 后支持直接写成
vector<vector<int>>
。 - 模板实例化让 vector 能适用于绝大多数类型,但应注意内存管理和性能问题。
通过对 vector 的理解和使用,你可以更好地管理动态数组,构建灵活且高效的数据结构。希望这篇文章能帮助你全面掌握 vector 的基本概念与实际应用。
参考资料
- cppreference.com 中关于 std::vector 的详细说明
- 各大 C++ 编码规范(如 Google C++ Style Guide)中对容器使用的建议
这篇博客示例旨在为你提供一个全面的 vector 使用指南,从基本概念到具体示例再到注意事项,助你在 C++ 开发中更高效地利用这一强大容器。