【C++】vector

📅 2026/8/3 2:32:22
【C++】vector
vector 内部六大核心类型别名value_type定义容器存放的原始元素类型作用 通用模板编程时不知道容器元素类型用它代表元素。// value_type 容器存储的容器类型 /*vectorint::value_type num 100; cout value_type : num endl;*/reference / const_referencereference等价于 value_type普通左值引用可读可改容器元素。//reference :元素左值引用 int //vec.push_back(1); //vectorint::reference ref vec[0]; //ref 200; //cout reference修改后元素 vec[0] endl;const_reference等价于 const value_type常量只读引用只能读取禁止修改。]//const_reference: 只读引用 const int //vec.push_back(1); //vectorint::const_reference cref vec[0]; ///*cref 100;*/ //编译报错 ,只读引用 不能修改 //cout 只读引用 const_reference : cref endl;使用场景函数返回容器元素引用返回 reference 允许外部修改返回 const_reference 保护容器数据只读。size_type用途---》表示容器元素个数、容量、下标索引。底层类型--无符号整数本质是 size_tunsigned 类型// size_type 无符号整数存容量个数 //vec.push_back(1); //vec.push_back(2); //vec.push_back(3); //vec.push_back(4); //vectorint::size_type cnt vec.size(); //cout size_type类型元素个数 cnt endl;difference_type底层类型--有符号整数 ptrdiff_tsigned 类型用途--专门存两个迭代器之间的差值迭代器相减的返回值类型为啥用 有符号 difference_type--迭代器可以前减后得到负数反向距离无符号 size_t 存不了负数//difference_type : 有符号整数迭代器差值 //vec.push_back(985); //vec.push_back(211); //auto it1 vec.begin(); //auto it2 vec.end(); //cout difference_type迭代器距离 it2 - it1 endl;iterator /const_iterator迭代器iterator读写迭代器普通可修改迭代器指向容器元素支持读写。//普通读写迭代器 iterator //vec.push_back(1); //vectorint::iterator it vec.begin(); //*it 985; //cout iterator修改后 *it endl;const_iterator只读迭代器常量迭代器只能读取元素不能修改内容。//只读迭代器 const_iterator //vec.push_back(1); //vectorint::const_iterator cit vec.begin(); ///**cit 211;*/ //编译报错 只读迭代器只能读不能修改 //cout *cit endl;begin() 返回 iterator / cbegin() 返回 const_iterator构造默认构造语法容器类型 变量名;创建空 vector没有任何元素.empty() 返回 true输出 1• size 0不能直接用 c1[0] 访问越界崩溃。适用场景先创建空容器后续再 push_back 添加数据。//默认构造 /*vectorintv1; v1.push_back(1); cout 默认构造,是否为空 boolalpha v1.empty() endl;*/拷贝构造语法C c(另一个同类型容器)--把已经存在的容器拷贝给新创建的容器//拷贝构造 C c2(c1) //vectorintc2{ 10,20,30 }; //vectorintc3(c2); //for (auto v : c3) //{ // cout v ; // /*}*/区间构造语法C c(起始迭代器, 末尾迭代器)拷贝 [begin, end) 区间内的元素左闭右开不限制必须是同一个 vector可以拷贝数组、其他容器的一段//区间构造 C (c,e) /*vectorintc2{ 10,20,30 }; vectorintc3(c2.begin(), c2.end()); cout 容器c3的首元素 c3[0] endl;*/列表初始化C11 及以后支持的初始化列表语法• 直接传入一组元素自动创建 vector 并存入• 下标从 0 开始c5 [0]1c5 [1]3c5 [2]5c5 [3]7• 也可写成 vectorint c5 {1,3,5,7};//列表初始化 C c{a,b,c,d,e,f} vectorintv1{ 1,2,3,4,5,6,7 }; cout 列表初始化第4个元素 v1[3] endl;补充vector 三大核心知识点深拷贝深拷贝包括拷贝构造 / 区间构造赋值运算符也是深拷贝 c1c2核心原理vector 的拷贝构造、区间拷贝都会分配全新堆内存新容器与原容器数据完全独立修改其中一个不会影响另一个。//深拷贝--开辟独立内存 vectorintv1 { 10,20,30,40,50 }; vectorintv2(v1); v2[0] 985; cout v2[0] v2[0] endl; //985 cout v1[0]: v1[0] endl; // 输出10,原容器数据不受影响下标访问 [] 越界风险关键特性:vector::operator[] 不做边界检查编译阶段不会报错运行时访问超出 size () 的下标直接越界访问非法内存程序崩溃 / 乱码。安全写法先扩容存入元素再访问下标带边界检查的安全访问at() 函数越界会抛出 out_of_range 异常//operator [] 下标访问 不检查会造成越界程序崩溃 vectorintv1 { 1,2,3,4,5 }; vectorint::iterator res v1.begin(); cout res[0] endl; /*cout res[10] endl;*/ // 程序崩溃 //避免程序崩溃的两种方法 //方法1先扩容存入元素再访问下标 vectorintv2; v2.push_back(10); cout v2[0] endl; //方法2带边界检查的安全访问 at函数 cout v2.at(0) endl;拷贝构造 vs 引用核心区分记忆不带 创建全新容器深拷贝带 只是原容器别名不分配新内存