目录前言一、定义和初始化 vector 对象1.初始化方式二、向 vector 对象中添加元素1.使用 push_back 成员函数2.使用 emplace_back 成员函数C11三、vector 常用迭代器四、vector 常用运算符五、vector 常用成员函数1.assign 成员函数2.empty 成员函数3.size 成员函数4.capacity 成员函数5.clear 成员函数6.front 成员函数7.back 成员函数8.insert 成员函数9.erase 成员函数10.push_back 成员函数11.pop_back 成员函数12.swap 成员函数13.resize 成员函数14.shrink_to_fit 成员函数C11六、vector 其它操作1. 使用范围 for 处理 vector 对象中的所有元素2. 使用下标访问 vector 对象元素3. decltype 类型指示符4. 不能通过下标增加数据七、综合练习练习 1vector 基本操作练习 2使用 vector 存储自定义类型练习 3vector 作为函数参数和返回值前言标准库类型 vector 是顺序容器的一个模板类该容器将元素以线性排列方式进行存放并且允许快速随机访问任何元素。 它是随机访问性能最佳的首选序列容器。可以看着是智能版的数组(能自动初始化,自动分配内存,自动回收内存,自动提供高效的服务)。其中所有元素的类型都相同,可以通过下标(索引)访问数据。本文详细介绍了vector的基本用法定义与初始化支持多种初始化方式如默认初始化、列表初始化、指定元素个数等。元素操作包括push_back/emplace_back添加元素pop_back删除元素以及insert/erase插入删除元素。访问元素可通过下标运算符[]、at()成员函数或迭代器访问元素。常用成员函数包括size()获取大小empty()判断是否为空clear()清空容器等。其他特性支持范围for循环遍历可作为函数参数和返回值并能存储自定义类型。一、定义和初始化 vector 对象在 C 中vector是标准库中提供的动态数组容器定义在vector头文件中位于std命名空间内。使用vector必须引用头文件#includevectorvector是一个模板类,使用时需要提供具体类型进行实例化。例如int main() { vectorint v1; //v1保存int的数据 vectordoublev2;//v2保存double的数据 return 0; }1.初始化方式默认初始化创建一个空 vectorvectorint v1; // v1 是一个空 vector存储 int 类型使用初始元素值列表初始化vectorint v2 {1, 2, 3, 4, 5}; // v2 初始化为包含 1, 2, 3, 4, 5 vectorint v3{1, 2, 3, 4, 5}; // 与上面等价指定元素个数和初始值vectorint v4(5, 10); // v4 包含 5 个元素每个元素值为 10指定元素个数vectorint v5(10); // v5 包含 10 个元素每个元素值为 0int 的默认值使用另一个 vector 初始化vectorint v6(v2); // v6 是 v2 的副本 vectorint v7 v2; // 与上面等价使用迭代器范围初始化vectorint v8(v2.begin(), v2.end()); // v8 包含 v2 的所有元素 vectorint v9(v2.begin(), v2.begin() 3); // v9 包含 v2 的前 3 个元素二、向 vector 对象中添加元素1.使用 push_back 成员函数功能在 vector 末尾添加一个元素参数要添加的元素值返回值无vectorint v; v.push_back(10); // v 现在包含 {10} v.push_back(20); // v 现在包含 {10, 20} v.push_back(30); // v 现在包含 {10, 20, 30}2.使用 emplace_back 成员函数C11功能在 vector 末尾直接构造一个元素参数构造元素所需的参数返回值无优点避免了额外的拷贝或移动操作比 push_back 更高效vectorpairint, string v; v.emplace_back(1, one); // 直接在 vector 中构造 pair 对象 v.push_back({2, two}); // 先构造临时 pair 对象再移动到 vector 中三、vector 常用迭代器vector类提供了多种迭代器类型用于遍历容器中的元素。和string类似,vector常用的迭代器如下:迭代器含义v.begin()第一个元素的迭代器v.end()最后一个元素的下一个位置迭代器(尾后迭代器或尾迭代器)v.cbegin()第一个元素的常量迭代器(不修改元素内容)v.cend()尾后常量迭代器(不修改元素内容)v.rbegin()从后往前的第一个迭代器v.rend()从后往前的最后一个迭代器vectorint v {1, 2, 3, 4, 5}; // 使用正向迭代器遍历 for (auto it v.begin(); it ! v.end(); it) { cout *it ; // 输出: 1 2 3 4 5 } // 使用反向迭代器遍历 for (auto it v.rbegin(); it ! v.rend(); it) { cout *it ; // 输出: 5 4 3 2 1 }四、vector 常用运算符vector类重载了多种运算符方便容器操作赋值运算符将一个 vector 赋值给另一个 vectorvectorint v1 {1, 2, 3}; vectorint v2; v2 v1; // v2 现在包含 {1, 2, 3}比较运算符判断两个 vector 是否相等!判断两个 vector 是否不相等判断一个 vector 是否小于另一个 vector字典序判断一个 vector 是否小于或等于另一个 vector判断一个 vector 是否大于另一个 vector判断一个 vector 是否大于或等于另一个 vectorvectorint v1 {1, 2, 3}; vectorint v2 {1, 2, 4}; bool b1 (v1 v2); // false bool b2 (v1 v2); // true第三个元素 3 4下标运算符[]访问指定位置的元素不进行边界检查vectorint v {10, 20, 30}; int x v[0]; // x 10 v[1] 25; // v 现在包含 {10, 25, 30}成员访问运算符at()访问指定位置的元素进行边界检查vectorint v {10, 20, 30}; int x v.at(0); // x 10 try { x v.at(5); // 抛出 out_of_range 异常 } catch (const out_of_range e) { cout Exception: e.what(); }五、vector 常用成员函数vector v 的成员函数含义v.assign()重新赋值数据,不重要,可以使用 v.empty()判断是否为空v.size()返回v的数据个数 (常用)v.capacity()返回v当前的容量.这个函数作用不大v.front()返回第一个元素的引用,重要函数v.back()返回最后一个元素的引用,重要函数v.insert()插入一个或多个元素,重要函数v.erase()删除一个或多个元素 重要函数v.push_back()尾插,重要函数v.pop_back()尾删,重要函数v.swap()交换两个vector的值,重要函数v.clear()清空数据,重要函数v.resize()指定数据个数v.shrink_to_fit()容量紧缩1.assign 成员函数功能替换 vector 中的元素参数版本 1count, value- 用count个value替换版本 2first, last- 用迭代器范围 [first, last) 中的元素替换返回值无vectorint v {1, 2, 3, 4, 5}; // 用 3 个 10 替换原元素 v.assign(3, 10); // v 现在包含 {10, 10, 10} // 用另一个 vector 的部分元素替换 vectorint v2 {20, 30, 40, 50}; v.assign(v2.begin(), v2.begin() 2); // v 现在包含 {20, 30}2.empty 成员函数功能判断 vector 是否为空参数无返回值如果 vector 为空返回true否则返回falsevectorint v1; vectorint v2 {1, 2, 3}; cout v1.empty(); // 输出: 1 (true) cout v2.empty(); // 输出: 0 (false)3.size 成员函数功能返回 vector 中元素的个数参数无返回值元素个数类型为size_tvectorint v {1, 2, 3, 4, 5}; cout v.size(); // 输出: 54.capacity 成员函数功能返回 vector 当前能够存储的元素个数容量参数无返回值容量大小类型为size_t说明容量 大小当容量不足时vector 会自动扩容vectorint v; cout v.capacity(); // 输出: 0 v.push_back(1); cout v.capacity(); // 输出: 1 v.push_back(2); cout v.capacity(); // 输出: 2通常会翻倍5.clear 成员函数功能删除 vector 中的所有元素参数无返回值无说明此操作会将 size 置为 0但不会改变 capacityvectorint v {1, 2, 3, 4, 5}; v.clear(); cout v.size(); // 输出: 0 cout v.capacity(); // 输出: 5容量不变6.front 成员函数功能返回 vector 中第一个元素的引用参数无返回值第一个元素的引用说明如果 vector 为空行为未定义vectorint v {1, 2, 3}; cout v.front(); // 输出: 1 v.front() 10; // v 现在包含 {10, 2, 3}7.back 成员函数功能返回 vector 中最后一个元素的引用参数无返回值最后一个元素的引用说明如果 vector 为空行为未定义vectorint v {1, 2, 3}; cout v.back(); // 输出: 3 v.back() 30; // v 现在包含 {1, 2, 30}8.insert 成员函数功能在指定位置插入元素参数版本 1pos, value- 在迭代器 pos 前插入 value版本 2pos, count, value- 在迭代器 pos 前插入 count 个 value版本 3pos, first, last- 在迭代器 pos 前插入迭代器范围 [first, last) 中的元素返回值指向新插入的第一个元素的迭代器vectorint v {1, 2, 4, 5}; // 在位置 2 前插入元素 3 auto it v.insert(v.begin() 2, 3); // v 现在包含 {1, 2, 3, 4, 5} // 在位置 0 前插入 2 个 0 v.insert(v.begin(), 2, 0); // v 现在包含 {0, 0, 1, 2, 3, 4, 5} // 在末尾插入另一个 vector 的元素 vectorint v2 {6, 7, 8}; v.insert(v.end(), v2.begin(), v2.end()); // v 现在包含 {0, 0, 1, 2, 3, 4, 5, 6, 7, 8}9.erase 成员函数功能删除 vector 中的元素参数版本 1pos- 删除迭代器 pos 指向的元素版本 2first, last- 删除迭代器范围 [first, last) 中的元素返回值指向被删除元素之后位置的迭代器vectorint v {1, 2, 3, 4, 5}; // 删除位置 2 的元素 auto it v.erase(v.begin() 2); // v 现在包含 {1, 2, 4, 5}it 指向 4 // 删除从位置 1 到位置 2 的元素 v.erase(v.begin() 1, v.begin() 3); // v 现在包含 {1, 5}10.push_back 成员函数功能在 vector 末尾添加一个元素参数要添加的元素值返回值无vectorint v; v.push_back(1); v.push_back(2); v.push_back(3); // v 现在包含 {1, 2, 3}11.pop_back 成员函数功能删除 vector 末尾的一个元素参数无返回值无说明如果 vector 为空行为未定义vectorint v {1, 2, 3}; v.pop_back(); // v 现在包含 {1, 2} v.pop_back(); // v 现在包含 {1}12.swap 成员函数功能交换两个 vector 的内容参数另一个 vector 对象返回值无vectorint v1 {1, 2, 3}; vectorint v2 {4, 5, 6}; v1.swap(v2); // v1 现在包含 {4, 5, 6}v2 现在包含 {1, 2, 3}13.resize 成员函数功能调整 vector 的大小参数new_size- 新的大小value- 可选参数用于填充新添加的元素默认为元素类型的默认值返回值无说明如果新大小大于当前大小会添加元素如果新大小小于当前大小会删除末尾元素vectorint v {1, 2, 3}; // 调整大小为 5新元素用 0 填充 v.resize(5); // v 现在包含 {1, 2, 3, 0, 0} // 调整大小为 2删除末尾元素 v.resize(2); // v 现在包含 {1, 2} // 调整大小为 4新元素用 9 填充 v.resize(4, 9); // v 现在包含 {1, 2, 9, 9}14.shrink_to_fit 成员函数C11功能请求将 vector 的容量减小到与大小匹配参数无返回值无说明这只是一个请求编译器可能会忽略此请求vectorint v; v.reserve(100); // 预分配 100 的容量 cout v.capacity(); // 输出: 100 v.push_back(1); v.push_back(2); v.push_back(3); cout v.size(); // 输出: 3 cout v.capacity(); // 输出: 100 v.shrink_to_fit(); cout v.capacity(); // 输出: 3理想情况六、vector 其它操作1. 使用范围 for 处理 vector 对象中的所有元素C11 引入的范围 for 循环可以简洁地遍历 vector 中的所有元素vectorint v {1, 2, 3, 4, 5}; // 读取元素 for (int x : v) { cout x ; // 输出: 1 2 3 4 5 } // 修改元素 for (int x : v) { x * 2; // 将每个元素乘以 2 } // v 现在包含 {2, 4, 6, 8, 10}2. 使用下标访问 vector 对象元素可以使用下标运算符[]访问 vector 中的元素vectorint v {10, 20, 30, 40, 50}; for (size_t i 0; i v.size(); i) { cout v[i] ; // 输出: 10 20 30 40 50 } v[2] 35; // 修改第三个元素 // v 现在包含 {10, 20, 35, 40, 50}3. decltype 类型指示符decltype可以用于推导 vector 元素的类型vectorint v {1, 2, 3}; decltype(v[0]) x v[0]; // x 的类型是 int引用 vectorstring vs {hello, world}; decltype(vs[0]) s vs[0]; // s 的类型是 string引用4. 不能通过下标增加数据使用下标运算符[]只能访问已存在的元素不能用于添加新元素vectorint v {1, 2, 3}; // 正确访问已存在的元素 v[0] 10; // 错误越界访问行为未定义 v[5] 50; // 危险v 只有 3 个元素 // 正确使用 push_back 添加元素 v.push_back(4); v.push_back(5); v[4] 50; // 现在可以访问第五个元素了七、综合练习练习 1vector 基本操作#include iostream #include vector using namespace std; int main() { // 创建并初始化 vector vectorint v {1, 2, 3, 4, 5}; // 输出原始 vector cout Original vector: ; for (int x : v) { cout x ; } cout endl; // 添加元素 v.push_back(6); v.push_back(7); // 输出添加元素后的 vector cout After push_back: ; for (int x : v) { cout x ; } cout endl; // 插入元素 v.insert(v.begin() 2, 10); // 输出插入元素后的 vector cout After insert: ; for (int x : v) { cout x ; } cout endl; // 删除元素 v.erase(v.begin() 5); // 输出删除元素后的 vector cout After erase: ; for (int x : v) { cout x ; } cout endl; // 修改元素 v[0] 100; v.back() 200; // 输出修改元素后的 vector cout After modification: ; for (int x : v) { cout x ; } cout endl; // 输出 vector 信息 cout Size: v.size() endl; cout Capacity: v.capacity() endl; cout Empty: (v.empty() ? Yes : No) endl; return 0; }练习 2使用 vector 存储自定义类型#include iostream #include vector #include string using namespace std; class Person { public: string name; int age; Person(string n, int a) : name(n), age(a) {} void display() const { cout Name: name , Age: age endl; } }; int main() { // 创建存储 Person 对象的 vector vectorPerson people; // 添加元素 people.emplace_back(Alice, 25); people.emplace_back(Bob, 30); people.emplace_back(Charlie, 35); // 遍历并显示所有元素 cout All people: endl; for (const auto person : people) { person.display(); } // 访问特定元素 cout First person: ; people[0].display(); cout Last person: ; people.back().display(); return 0; }练习 3vector 作为函数参数和返回值#include iostream #include vector #include algorithm using namespace std; // 函数计算 vector 中元素的和 int sumVector(const vectorint v) { int sum 0; for (int x : v) { sum x; } return sum; } // 函数返回一个排序后的 vector vectorint sortVector(vectorint v) { sort(v.begin(), v.end()); return v; } int main() { vectorint v {5, 2, 8, 1, 9}; cout Original vector: ; for (int x : v) { cout x ; } cout endl; // 计算和 int sum sumVector(v); cout Sum: sum endl; // 排序 vectorint sortedV sortVector(v); cout Sorted vector: ; for (int x : sortedV) { cout x ; } cout endl; return 0; }