学无先后,达者为师

网站首页 编程语言 正文

Vector容器的系列操作( 详解 )

作者:比特冬哥 更新时间: 2022-07-18 编程语言

文章目录

  • 一、Vector容器简介
  • 二、基本操作
  • 三、代码实现
    • 1. 构造函数
    • 2. 赋值
    • 3. 插入和删除
    • 4. 容量和大小
    • 5. 数据存取
    • 6. 预留空间
    • 7. 互换容器


一、Vector容器简介

vector是 C++ 标准模板库 中的部分内容,中文偶尔译作“容器”,但并不准确。 它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的 动态数组 ,能够增加和压缩数据。

容器特性

  1. 顺序序列
    顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

  2. 动态数组
    支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。

  3. 能够感知内存分配器的(Allocator-aware)
    容器使用一个内存分配器对象来动态地处理它的存储需求。

二、基本操作

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

  1. 赋值
//总结:vector赋值方式比较简单,使用operator=或者assign都可以 
//  给vector容器进行赋值
// vector &operator=(const vector &vec);   重载等号操作符 
// assign(beg,end);        将[begin(),end())区间中的数据拷贝赋值给本身 
// assign(n,elem);         将n个elem拷贝赋值给本身 
  1. 插入和删除
//  push_back(ele);   尾部插入元素ele 
//  pop_back();       删除最后一个元素 
//  insert(const_iterator pos,ele);       迭代器指向位置pos插入元素ele 
//	insert(const_iterator pos,int count,ele);     迭代器指向位置pos插入count个元素ele 
//	erase(const_iterator pos);     删除迭代器指向的元素 
//  erase(const_iterator start,coust_iterator end);    删除迭代器从start到end之间的元素 
// 	clear();       删除容器中所有元素 
  1. 容量和大小
// empty();    判断容器是否为空 
// capacity();  容器的容量 
// size();    返回容器中元素的个数 
// resize(int num);  重新指定容器的长度为num,若容器变长,则以默认值填充新位置
//                                            若容器变短,则末尾超出容器长度的元素被删除 
// resize(int num,elem);   重新指定容器的长度为num,若容器变长,则以elem值填充新位置
//                                                  若容器变短,则末尾超出容器长度的元素被删除 
  1. 数据存取
// at(int idx);    返回索引idx所指的数据   
// operator[];     返回索引idx所指的数据 
// front();        返回容器中第一个数据元素 
// back();         返回容器中最后一个数据元素 
  1. 预留空间
//总结:   如果数据量较大时,可以一开始利用reserve 预留空间 
        
//减少vector在动态扩展容量时的扩展次数 
//  reserve(int len);  容器预留len个元素长度,预留位置不初始化,元素不可访问 
  1. 互换容器
//  swap(vwc);   将vec与本身的元素互换 

三、代码实现

1. 构造函数

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


//vector 容器构造
void test01()
{
	vector<int> v1;  //默认构造
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);           //后插入数值 
	} 
	printVector(v1);
	
//通过区间方式进行构造
	vector<int> v2(v1.begin(),v1.end());     //将v1的值赋给v2 
	printVector(v2);
	
//n个elem方式构造
	vector<int> v3(10,100);        //将10个为100的数值 赋给v3
	printVector(v3);
	
//拷贝构造
	vector<int> v4(v3);          //将v3的值拷贝给v4 
	printVector(v4); 
} 

2. 赋值

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


//vector 容器赋值
void test01()
{
	vector<int> v1;  //默认构造
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);           //后插入数值 
	} 
	printVector(v1);
	
//赋值 operator=
	vector<int> v2;
	v2=v1; 
	printVector(v2);
	
//assign
	vector<int> v3;
	v3.assign(v1.begin(),v1.end());    //利用assign区间方式(左闭右开)  将v1赋值给v3    
	printVector(v3);
	
//n个elem方式赋值
	vector<int> v4;
	v4.assign(10,100);        //10个100赋值给v4 
	printVector(v4); 
} 

3. 插入和删除

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


//vector 容器进行插入、删除操作 
void test01()
{
	vector<int> v1;  //默认构造

//尾插
	v1.push_back(10); 
	v1.push_back(20); 
	v1.push_back(30); 
	v1.push_back(40); 
	v1.push_back(50); 
//遍历
	printVector(v1);
	
//尾删
	v1.pop_back();
	printVector(v1);
	
//插入    第一个参数是迭代器
	v1.insert(v1.begin(),100);      //在开头位置插入100
	printVector(v1);
	
	v1.insert(v1.begin(),2,1000);      //在开头位置插入两个1000
	printVector(v1);
	
//删除   参数是迭代器
	v1.erase(v1.begin());     //删除开头第一个元素
	printVector(v1);
	
//清空
//	v1.erase(v1.begin(),v1.end());     //删除从开头到最后一个元素
	v1.clear(); 
	printVector(v1);

} 

4. 容量和大小

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


//vector容器的容量和大小操作
void test01()
{
	vector<int> v1;  //默认构造
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);           //后插入数值 
	} 
	printVector(v1);
	
	if(v1.empty())    //为真 代表容器为空
	{
		cout<<"v1为空"<<endl;
	}
	else
	{
		cout<<"v1不为空"<<endl;
		cout<<"v1的容量为:"<<v1.capacity()<<endl;
		cout<<"v1的大小为:"<<v1.size()<<endl;
	}
	
//重新指定大小
	v1.resize(15,100);     //利用重载版本,可以指定默认填充值  这里设定的大小长度为15,长出的部分用100填充(不设定的话,默认用0填充) 
	printVector(v1);
	
	v1.resize(5);       //设定的大小长度为5 
	printVector(v1);   //如果重新指定的长度比原来短了,超出部分会删除掉 
} 

5. 数据存取

//对vector容器中的数据进行存取操作
void test01()
{
	vector<int> v1;  //默认构造

	for(int i=0;i<10;i++)
	{
		v1.push_back(i);
	} 
	
	//利用[]方式访问数组元素
	for(int i=0;i<v1.size();i++)
	{
		cout<<v1[i]<<" ";
	}
	cout<<endl;
	
	//利用at方式访问元素
	for(int i=0;i<v1.size();i++)
	{
		cout<<v1.at(i)<<" ";
	} 
	cout<<endl;
	
	//获取第一个元素
	cout<<"第一个元素为:"<<v1.front()<<endl;
	
	//获取最后一给元素
	cout<<"最后一个元素为:"<<v1.back()<<endl; 

} 

6. 预留空间

void test01()
{
	vector<int> v;  
	
	//预留空间 
	v.reserve(10000);         //未加此行代码前 num=15,即需要动态扩展十五次    加此行代码只需要1次,即起预留作用 
	
	int num=0;
	int *p=NULL;
	for(int i=0;i<10000;i++)
	{
		v.push_back(i);
		if(p!=&v[0])
		{
			p=&v[0];
			num++;
		}
	}
	cout<<"num = "<<num<<endl;

} 

7. 互换容器

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


//vector 容器进行插入、删除操作 
void test01()
{
	cout<<"交换前:"<<endl;
	vector<int> v1;  //默认构造
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	
	vector<int> v2;  //默认构造
	for(int i=9;i>=0;i--)
	{
		v2.push_back(i);
	}
	printVector(v2);
	
	cout<<"交换后:"<<endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);

} 

//实际用途
//巧用swap可以收缩内存空间 
void test02()
{
	vector<int> v;  
	for(int i=0;i<10000;i++)
	{
		v.push_back(i);
	}
	cout<<"最初时:"<<endl;
	cout<<"v的容量为:"<<v.capacity()<<endl;
	cout<<"v的大小为:"<<v.size()<<endl;	
	
	//重新指定大小
	cout<<endl<<"重新指定大小后:"<<endl; 
	v.resize(3);     
	cout<<"v的容量为:"<<v.capacity()<<endl;
	cout<<"v的大小为:"<<v.size()<<endl; 
	
	//巧用swap收缩内存
	cout<<endl<<"创建匿名对象进行交换后:"<<endl;
	vector<int>(v).swap(v);     //创建匿名对象进行交换,匿名对象最终会被系统自动释放 
	cout<<"v的容量为:"<<v.capacity()<<endl;
	cout<<"v的大小为:"<<v.size()<<endl;
}

原文链接:https://blog.csdn.net/Dustinthewine/article/details/125815141

栏目分类
最近更新