vector容器

本文详细介绍了C++标准库中的动态数组容器`vector`,包括其特性、构造函数、赋值操作、大小操作、数据存取、插入删除以及空间管理。通过示例展示了如何利用`swap`函数缩减空间和`reserve`预分配空间以提高程序效率。此外,还探讨了`vector`在实际编程中的高效应用。
摘要由CSDN通过智能技术生成

概念

  • 动态数组,可变数组
  • 是一个单口容器,尾部插入删除的效率更高,从其他位置插入删除会引起其他元素的移动,从而效率低下
  • pushback()方法尾部插入
  • 提供pop_back(),尾部删除
  • 用.begin()和.end()标识结尾和开头,end不是元素位置

动态增长基本原理

  • 申请一块更长的内存空间
  • 把原有元素拷贝到新的内存空间
  • 把增长的元素拷贝到新空间
  • 指针指向新的空间,释放旧的空间

vector构造函数

vector<T> v;//采用模板实现类实现,默认构造函数
vector(v.begin(),v.end());//将v[begin(),end()]区间的元素拷贝给本身
vector(n,elem);//构造函数将n个elem拷贝给本身
vector(const vector &vec);//拷贝构造函数

//for example
int arr[]={2,3,4,1,9};
vector<int> v1(arr,arr+sizeof(arr)/sizeof(int));

vector常用赋值操作

  • 交换swap()的实质上是指针交换而不是拷贝
assign(beg,end);//将[beg,end]区间中的数据拷贝赋值给本身,,从首地址开始,原本有值会被覆盖
assign(n,elem);//将n个elem拷贝赋值给本身,,并且会初始化,去掉之前的元素
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);//将vec与本身的元素互换

//第一个赋值函数
int arr[]={0,1,2,3,4};
assign(arr,arr+5);//使用数组初始化vector

vector大小操作

size();//返回容器元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
resize(int num,elem);//重新指定容器长度为num,若容器变长,则以elem值填充新的位置,如果容器变短,则末尾超出容器长度的元素被删除
capacity();//返回容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问

vector数据存取操作

at(int idx);//返回索引处所指的数据,如果idx越界抛出异常out_of_range
operator[idx];//返回索引idx处所指的数据,越界时,运行直接报错,甚至宕掉
front();//返回容器中的第一个元素
back();//返回容器中的最后一个元素

vector插入和删除操作

insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
push_back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有的元素

巧用swap缩减空间

  • swap()自身交换指针,然后初始化,释放多余空间,达到缩减空间的目的
vector<int> (v).swap(v);
cout << "-----------" << endl;
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;

reserve预留空间提高程序效率

  • 知道大概存储数据才预留空间
  • 拷贝和重新申请内存都相对耗时间

代码示例

#include<iostream>
#include<string>
#include<vector>
using namespace std;

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


//初始化
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());
	vector<int> v4(v3);

	PrintVector(v1);  
	PrintVector(v2);
	PrintVector(v3);
	PrintVector(v4);
}

//常用赋值操作
void test02()
{
	int arr[] = { 10,20,30,40 };
	vector<int> v1;//默认构造函数
	vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
	v1.assign(v2.begin(), v2.end());

	vector<int> v3;
	v3 = v1;
	int arr1[] = { 100,200,300,400 };
	vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));//默认构造
	cout << "-----------" << endl;
	PrintVector(v1);
	PrintVector(v2);
	PrintVector(v3);
	PrintVector(v4);
	cout << "-----------" << endl;

	v4.swap(v1);//实质上是指针交换
	PrintVector(v1);
	PrintVector(v2);
	PrintVector(v3);
	PrintVector(v4);
}


//大小操作
void test03()
{
	int arr[] = { 100,200,300,400 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//默认构造
	cout << "size: " << v1.size() << endl;//打印元素个数

	if (v1.empty()==true)
	{
		cout << "空!" << endl;
	}
	else
	{
		cout << "不空!" << endl;
	}
	PrintVector(v1);
	v1.resize(2);
	PrintVector(v1);
	v1.resize(4);//默认值以0填充
	PrintVector(v1);
	v1.resize(6, 1);
	PrintVector(v1);
	v1.reserve(10);
	PrintVector(v1);
	cout << v1.capacity() << endl;//打印容量
	cout << v1.size() << endl;//打印元素个数
}


//数据存取操作
void test04()
{
	int arr[] = { 100,200,300,400 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));//默认构造
	for (int i=0;i<v1.size();i++)
	{
		cout << v1.at(i) << "  ";
	}
	cout << endl;
	cout << "front:" << v1.front() << endl;
	cout << "back:" << v1.back() << endl;
}

//插入和删除操作
void test05()
{
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	//头插法
	v1.insert(v1.begin(), 30);
	v1.insert(v1.end(), 40);
	v1.insert(v1.begin()+2, 100);//vector支持随机访问
	PrintVector(v1);
	v1.erase(v1.begin());
	PrintVector(v1);
	v1.clear();//删完
	cout << v1.size() << endl;
	PrintVector(v1);
}

//巧用swap缩减空间
void test06()
{
	//vector添加元素
	vector<int> v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
	}
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

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

	//收缩空间
	vector<int> (v).swap(v);
	cout << "-----------" << endl;
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

}

void test07()
{
	//reserve预留空间resize区别
	int num = 0;
	int* address = NULL;
	
	vector<int> v1;
	v1.reserve(100000);//预留空间
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
		if (address != &(v1[0]))
		{
			address = &(v1[0]);
			num++;
		}	
	}
	cout << num << endl;
	cout << "capacity:" << v1.capacity() << endl;
}

int main(void)
{
	//test01();
	//test02();
	//test03();
	//test04();
	//test05();
	//test06();
	test07();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Csyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值