vector 内部六大核心类型别名
- value_type
**定义:**容器存放的原始元素类型
**作用 :**通用模板编程时,不知道容器元素类型,用它代表元素。
// value_type 容器存储的容器类型 /*vector<int>::value_type num = 100; cout << "value_type : " << num << endl;*/
- reference / const_reference
reference
等价于 value_type&,普通左值引用,可读可改容器元素。
//reference :元素左值引用 int & //vec.push_back(1); //vector<int>::reference ref = vec[0]; //ref = 200; //cout << "reference修改后元素:" << vec[0] << endl;const_reference
等价于 const value_type&,常量只读引用,只能读取,禁止修改。]
//const_reference: 只读引用 const int& //vec.push_back(1); //vector<int>::const_reference cref = vec[0]; ///*cref = 100;*/ //编译报错 ,只读引用 不能修改 //cout << "只读引用 const_reference : " << cref << endl;使用场景:函数返回容器元素引用:返回 reference 允许外部修改;返回 const_reference 保护容器数据只读。
- size_type
用途---》表示:容器元素个数、容量、下标索引。
底层类型-->无符号整数,本质是 size_t(unsigned 类型)
// size_type 无符号整数:存容量,个数 //vec.push_back(1); //vec.push_back(2); //vec.push_back(3); //vec.push_back(4); //vector<int>::size_type cnt = vec.size(); //cout << "size_type类型元素个数:" << cnt << endl;
- difference_type
底层类型-->有符号整数 ptrdiff_t(signed 类型)
用途-->专门存两个迭代器之间的差值(迭代器相减的返回值类型)
为啥用 有符号 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); //vector<int>::iterator it = vec.begin(); //*it = 985; //cout << "iterator修改后:" << *it << endl;const_iterator:只读迭代器
常量迭代器,只能读取元素,不能修改内容。
//只读迭代器 const_iterator //vec.push_back(1); //vector<int>::const_iterator cit = vec.begin(); ///**cit = 211;*/ //编译报错 只读迭代器只能读不能修改 //cout << *cit << endl;begin() 返回 iterator / cbegin() 返回 const_iterator
构造
- 默认构造
语法:容器类型 变量名;
- 创建空 vector,没有任何元素;
- .empty() 返回 true(输出 1);
- • size = 0,不能直接用 c10 访问(越界崩溃)。
适用场景:先创建空容器,后续再 push_back 添加数据。
//默认构造 /*vector<int>v1; v1.push_back(1); cout << "默认构造,是否为空:" << boolalpha << v1.empty() << endl;*/
- 拷贝构造
**语法:**C c(另一个同类型容器)-->把已经存在的容器拷贝给新创建的容器
//拷贝构造 C c2(c1) //vector<int>c2{ 10,20,30 }; //vector<int>c3(c2); //for (auto& v : c3) //{ // cout << v << " "; // /*}*/
- 区间构造
语法:C c(起始迭代器, 末尾迭代器)
拷贝 [begin, end) 区间内的元素(左闭右开);
不限制必须是同一个 vector,可以拷贝数组、其他容器的一段;
//区间构造 C (c,e) /*vector<int>c2{ 10,20,30 }; vector<int>c3(c2.begin(), c2.end()); cout << "容器c3的首元素:" << c3[0] << endl;*/
- 列表初始化
C++11 及以后支持的初始化列表语法
• 直接传入一组元素,自动创建 vector 并存入;
• 下标从 0 开始:c5 0=1,c5 1=3,c5 2=5,c5 3=7;
• 也可写成 vector<int> c5 = {1,3,5,7};
//列表初始化 C c{a,b,c,d,e,f} vector<int>v1{ 1,2,3,4,5,6,7 }; cout << "列表初始化第4个元素:" << v1[3] << endl;补充
vector 三大核心知识点
- 深拷贝
**深拷贝包括:**拷贝构造 / 区间构造
赋值运算符也是深拷贝 (c1=c2)
核心原理: vector 的拷贝构造、区间拷贝都会分配全新堆内存,新容器与原容器数据完全独立,修改其中一个不会影响另一个。
//深拷贝-->开辟独立内存 vector<int>v1 = { 10,20,30,40,50 }; vector<int>v2(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 [] 下标访问 不检查,会造成越界,程序崩溃 vector<int>v1 = { 1,2,3,4,5 }; vector<int>::iterator res = v1.begin(); cout << res[0] << endl; /*cout << res[10] << endl;*/ // 程序崩溃 //避免程序崩溃的两种方法 //方法1,先扩容存入元素,再访问下标 vector<int>v2; v2.push_back(10); cout << v2[0] << endl; //方法2:带边界检查的安全访问 at函数 cout << v2.at(0) << endl;
- 拷贝构造 vs 引用
核心区分记忆
不带 &:创建全新容器,深拷贝;
带 &:只是原容器别名,不分配新内存
【C++】vector
Yyyyyy~2026-08-03 8:50
相关推荐
XH华2 小时前
C++语言第四章:模板初阶我不是懒洋洋2 小时前
从零实现一个分布式流处理:Apache Flink的核心设计2401_869769592 小时前
C/C++常识j7~3 小时前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解luj_176812 小时前
星火科技助力边远地区防病攻坚zmzb010313 小时前
C++课后习题训练记录Day175啦啦啦啦啦zzzz14 小时前
工具:动态类工厂和用配置文件存储属性脱胎换骨-军哥14 小时前
C++ 代码规范与格式化指南迷途之人不知返16 小时前
lambda表达式
