【STL】vector容器的赋值,读取、插入、删除、空间压缩和特性详解+实例

一 特性说明

vector是一个动态数组,当空间不足的时候插入新元素,vector会重新申请一块更大内存空间,将旧空间数据拷贝到新空间,然后释放旧空间。Vector是单口容器,所以在尾端插入和删除效率较高,在指定位置插入,势必会引起元素移动,效率较低。
****reserv和resize的区别?
答:reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,酒可以引用容器内的对象了。

1 Vector 拷贝构造

在这里插入图片描述

2常用赋值操作

在这里插入图片描述

3-vector的大小操作

在这里插入图片描述

4-数据存储操作

在这里插入图片描述

5-插入与删除操作

在这里插入图片描述

实例:

```cpp
#include<iostream>
using namespace std;
#include<vector>

void printVector(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

///////////////////////1-初始化
void test01() {
	vector<int>v1;//默认构造;

	int arr[] = { 10,20,30,40 };
	vector<int>v2(arr, arr + sizeof(arr)/sizeof(int));//数组初始化
	vector<int>v3(v2.begin(), v2.end());//将V3用V2来初始化
	vector<int>v4(v3);
	
	printVector(v2);
	printVector(v3);
	printVector(v4);
}
/////////////////2-常用赋值操作
void test02() {
	int arr[] = { 10,20,30,40 };
	vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));//数组初始化
	
	//成员方法
	vector<int>v2;
	v2.assign(v1.begin(), v1.end());//通过v1给v2赋值

	//重载=
	vector<int>v3;
	v3 = v2;

	int arr1[] = { 100,200,300,400 };
	vector<int>v4(arr1, arr1 + sizeof(arr1) / sizeof(int));

	printVector(v1);
	printVector(v2);
	printVector(v3);
	printVector(v4);

	cout << "------------------------------------" << endl;
	//交换
	v4.swap(v1);//交换的实质是指针指向的交换
	printVector(v1);
	printVector(v2);
	printVector(v3);
	printVector(v4);
	
}
//////////////////3-大小操作
void test03() {
	int arr1[] = { 100,200,300,400 };
	vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int));

	cout << "size:" << v1.size() << endl;//元素个数
	if (v1.empty())
		cout << "空!" << endl;
	cout << "不空" << endl;
	printVector(v1);
	v1.resize(2);//resize 若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
	//输出:100 200
	printVector(v1);
	v1.resize(6,1);//输出100 200 1 1 1 1 变长,多的改为1.若写成v1.resize(6);输出100 200 0 0 0 0
	printVector(v1);

	cout << v1.capacity() << endl;//容量输出

}
////////////4-vector 存取数据
void test04() {
	int arr1[] = { 100,200,300,400 };
	vector<int>v1(arr1, arr1 + sizeof(arr1) / sizeof(int));

	for (int i = 0; i < v1.size(); ++i)
		cout << v1[i] << " ";
	cout << endl;


	for (int i = 0; i < v1.size(); ++i)
		cout << v1.at(i) << " ";
	cout << endl;
	//区别:at抛异常 []不抛异常

	cout << "front:" << v1.front() << endl;
	cout << "end:" << v1.back() << endl;
}
/////////////5-插入删除
void test05() {

	vector<int>v;
	v.push_back(10);
	v.push_back(20);

	//头插法
	v.insert(v.begin(), 30);//在头插入30
	v.insert(v.end(), 40);//在尾插入40
	v.insert(v.begin() + 2, 100);//在第二个位置上插入100    //vector支持随机访问
	//支持数组下标,一般都支持随机访问
	//迭代器可以直接+2, +3 -2 -5操作
	printVector(v);//30 10 100 20 40     
	
	//删除
	v.erase(v.begin());//删除第一个
	printVector(v);
	v.erase(v.begin() + 1, v.end());//删除第二个到最后的
	printVector(v);
	v.clear();//清空所有
	printVector(v);

}

//巧用swap缩减空间

void test06() {
	//vector 添加元素,它会自动增长 删除元素时候,不会自动减少。

	vector<int>v;
	for (int i = 0; i < 100000; ++i)
		v.push_back(i);
	cout << "size:" << v.size() << endl;// 100000
	cout << "capacity:" << v.capacity() << endl;//138255

	v.resize(10);
	cout << "---------------------------" << endl;
	cout << "size:" << v.size() << endl; //10
	cout << "capacity:" << v.capacity() << endl;//138255

	//收缩空间
	vector<int>(v)   //这是个匿名对象
		.swap(v);//用v来初始化这个对象,那么会动态对其进行空间的分配
	cout << "---------------------------" << endl;
	cout << "size:" << v.size() << endl;//10
	cout << "capacity:" << v.capacity() << endl;//10
}
int main() {
	//test01();
	//test02();
	//test03();
	//test04();
	//test05();
	test06();
	return 0;
}

reserve 预留空间 与resize区别

void test07() {
	//reserve 预留空间 与resize区别
	int num = 0;//计数对象拷贝的次数
	int* address = NULL;
	vector<int>v;
	v.reserve(100000);//该句话不加之前 需要拷贝24次或者别的次数(电脑软件不同),当加上该句之后最后结果Num=1;
	//reserve(100000) 代表一开始给v预留100000个空间
	for (int i = 0; i < 10000; ++i) {
		v.push_back(i);
		if (address != &(v[0])) {
			address = &(v[0]);
			num++;
		}
	}
	cout << "num:" <<num<<endl;
}
发布了57 篇原创文章 · 获赞 28 · 访问量 4132

猜你喜欢

转载自blog.csdn.net/weixin_41747893/article/details/102840664