STL笔记【迭代器、vector容器】

本文详细介绍了C++标准库中的vector容器,包括其动态扩展特性、构造函数、赋值、插入删除、数据获取以及内存管理。通过实例展示了vector的引用传递、拷贝构造、尾插、迭代器操作、resize、insert、erase、clear等方法的使用。同时,讨论了如何通过swap函数进行内存回收以及reserve函数预先分配内存以减少动态扩展的次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用时要包含vector容器的头文件
vector容器是动态扩展的,在扩展的时候会开辟一片新的空间,将原来的vector容器内的数据都拷贝到这个新空间中去。

vector的构造函数和尾插

引用方式传递的参数,传的是对象本身,而不是创建一个副本,引用就是起了一个别名。
值传递会重新建立一个副本,函数操作的是副本,对本体没有任何改变;
如果值传递传的是一个指针,对指针指向的内容进行修改,会改变本来空间的内容,因为现在建立的一个指针副本也是指向这一片空间,对这片空间进行操作,就是同一片空间,但是改变副本指针本身,不会对本体有影响。
另外:C/C++中数组名作为函数参数传递传的是数组首地址

假如迭代器变量名为it)*it 的类型就是 容器<类型> 中的类型。如果尖括号中的是一个类的话,
it->类属性 也可以访问到类的属性。

void printfVector(vector<int>& v) {//引用传递,操作的是本体;
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";//容器类型::iterator 变量名 这个是迭代器类型的数据;
		//it + 1;//如果迭代器可以这样移动证明可以随机访问,
		//it - 1;//可以随机向前访问
	}			//begin()指向的是容器中第一个数,end()指向的是容器中最后一个数的后一位!
	cout << endl;
}
void printfVector_const(const vector<int>& v) {//加了一个const关键字,是为了防止对数据误操作
	for (vector<int>::const_iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";//对应的const迭代器是 容器类型::const_iterator 变量名
	}
	cout << endl;
}
int main() {
	vector<int> v; //默认构造函数
	v.push_back(10);//尾插
	v.push_back(20);
	v.push_back(30);
	vector<int> v1(v);//拷贝构造,将v给v1 v1 = v
	vector<int> v2(v.begin(),v.end()); //将迭代器位置的数据给v2
	vector<int> v3(5,30);//将5个30给v3
	printfVector(v);
	printfVector(v1);
	printfVector(v2);
	printfVector(v3);
	system("pause");
	return 0;
}
}

vector赋值和容量大小

int main() {
	vector<int> v; 
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(31);
	v.push_back(32);
	v.push_back(32);
	v.push_back(32);
	vector<int> v1;
	v1 = v; //operator= 重载运算符赋值方法;
	vector<int> v2;
	v2.assign(v.begin(), v.end());//assign()函数,迭代器赋值;
	vector<int> v3;
	v3.assign(5,10);//assign()函数,给v4赋值5个10;
	
	if (v.empty()) {//返回时布尔类型的true或者false;
		cout << "容器v为空" << endl;
	}
	else {//其大小和容量不是一个概念,大小<=容量,这是因为vector容器的
		  //扩容机制的问题,每次满的时候都会再重新申请一篇更大的内存空间。
		cout << "容器不为空,其容量为:" << v.capacity() << "  其大小为:" << v.size() << endl;
	}
	
	v.resize(10);//重新指定容器长度,若比原来的小,则截取到10,若比原来的大则多得位置自动补0;
	v.resize(100,3);//还有一种用法是超出位置自动补3;
	
	system("pause");
	return 0;
}

vector插入删除和数据获取

int main() {
	vector<int> v; 
	v.push_back(10);//尾插
	v.push_back(20);
	v.push_back(30);
	
	v.pop_back();//尾删

	v.insert(v.begin() + 2, 1000);//向迭代器位置插入1000;
	v.insert(v.begin() + 1, 2, 0);//向迭代器位置插入2个0;

	v.erase(v.begin());//删除迭代器位置的数据;
	v.erase(v.begin(), v.end());//删除迭代器A(第一个参数)到迭代器B(第二个参数)的数据;

	v.clear();//清空vector容器中的数据;

	vector<int> v1;
	v1.push_back(12);
	v1.push_back(13);
	v1.push_back(20);

	int first_num = v1.front();//取第一个元素
	int end_num = v1.back();//取最后一个元素

	int num1 = v1[2];//重载[]运算符,类似数组;

	int num2 = v1.at(2);//at()函数取下标2的元素;
	system("pause");
	return 0;
}

vector的内存回收(swap函数)与预留空间函数reserve()

内存回收

int main() {
	vector<int> v; 
	for (int i = 0; i < 150000; i++) {
		v.push_back(i);
	}

	cout << "v的容量为:" << v.capacity() << endl;
	cout << "v的大小为:" << v.size() << endl;

	v.resize(4);

	cout << "v的容量为(resize后):" << v.capacity() << endl;
	cout << "v的大小为(resize后):" << v.size() << endl;
	//收缩内存
	vector<int>(v).swap(v);//匿名对象

	cout << "v的容量为(收缩后):" << v.capacity() << endl;
	cout << "v的大小为(收缩后):" << v.size() << endl;
	system("pause");
	return 0;
}

执行结果如下:
在这里插入图片描述
预留空间函数使用的前提是大概知道vector的大小的前提下;如果预留给的空间小了那么他还是会动态扩展。

int main() {
	vector<int> v; 
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 150000; i++) {
		v.push_back(i);
		if (p != &v[0]) {//每次扩展的时候都会申请一片新的空间,那么初始地址就会变化
						 //p指针如果不指向初始地址了,那么就是一次动态扩展的过程。
			p = &v[0];
			num++;
		}
	}
	cout << "总共扩展了 " << num << " 次内存" << endl;
	
	//减少vector动态扩展容量时的扩展次数
	vector<int> v1;
	v1.reserve(150000);//(注意这个函数名是 reserve )预留空间,预留位置不初始化,元素不可访问。
	int num1 = 0;
	int* p1 = NULL;
	for (int i = 0; i < 150000; i++) {
		v1.push_back(i);
		if (p1 != &v1[0]) {
			p1 = &v1[0];
			num1++;
		}
	}
	cout << "使用resize后总共扩展了 " << num1 << " 次内存" << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值