【C++】vector

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


构造

  • 默认构造

语法:容器类型 变量名;

  1. 创建空 vector,没有任何元素;
  2. .empty() 返回 true(输出 1);
  3. • 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\[\] 不做边界检查:

  1. 编译阶段不会报错;
  2. 运行时访问超出 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 引用

核心区分记忆

不带 &:创建全新容器,深拷贝;
带 &:只是原容器别名,不分配新内存

相关推荐
XH华2 小时前
C++语言第四章:模板初阶
数据结构·c++·算法
我不是懒洋洋2 小时前
从零实现一个分布式流处理:Apache Flink的核心设计
c++
2401_869769592 小时前
C/C++常识
c++
j7~3 小时前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制
luj_176812 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
zmzb010313 小时前
C++课后习题训练记录Day175
开发语言·c++
啦啦啦啦啦zzzz14 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
脱胎换骨-军哥14 小时前
C++ 代码规范与格式化指南
开发语言·c++·代码规范
迷途之人不知返16 小时前
lambda表达式
c++