【C++】提高编程——03STL常用容器——vector容器

3.2 vector 容器

3.2.1 vector 基本概念

  功能: vector数据结构和数组非常相似,也称为单端数组
  vector与普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展。
  动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
在这里插入图片描述

3.2.2 vector 构造函数

  功能描述:创建vector容器
  函数原型:
  (1)vector < T > v;——采用模板实现类实现,默认构造函数
  (2)vector(v.begin(),v.end());——将v [begin(),end())区间中的元素拷贝给本身
  (3)vector(n,elem);——构造函数将n个elem拷贝给本身
  (4)vector(const vector &vec);——拷贝构造函数

#include <iostream>
using namespace std;

//包含容器头文件
#include <vector>

//vector构造函数

void printVector(vector<int> &v)
{
	//打印vector容器中的数据
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//vector<int>::iterator为vector的迭代器
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	//1.默认构造函数
	vector<int> v1;
	for (int i = 0; i < 10; i++)//vector容器中添加数据
	{
		v1.push_back(i);
	}
	printVector(v1);

	//2.通过区间的方式构造
	vector<int> v2(v1.begin(), v1.end());
	printVector(v2);

	//3.n个elem方式构造
	vector<int> v3(4, 12);//4个12
	printVector(v3);

	//4.拷贝构造
	vector<int> v4(v3);
	printVector(v4);
}
int main()
{
	test01();
}

3.2.3 vector赋值操作

  功能描述:给vector容器赋值(=或v.assign()
  函数原型:
  (1)vector & operator=(const vector &vec);——重载等号操作符
  (2)assign(beg,end);——将[beg,end)区间中的数据拷贝赋值给本身
  (3)assign(n,elem);——将n个elem拷贝赋值给本身

#include<iostream>
using namespace std;

#include <vector>

void printVector(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//vector容器的迭代器vector<int>::iterator
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//1.=赋值
	vector <int> v2 = v1;
	printVector(v2);

	//2.assign方式
	vector<int> v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

	//3.assign方式
	vector<int> v4;
	v4.assign(10, 100);
	printVector(v4);	
}
int main()
{
	test01();
}

3.2.4 vector容量和大小

  功能描述:对vector的容量和大小进行操作
  函数原型:
  (1)v.empty();——判断容器是否为空
  (2)v.capacity();——容器容量
  (3)v.size();——返回容器中元素个数
  (4)v.resize(int num);——重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则超出容器长度的元素被删除
  (5)v.resize(int num,elem);——重新指定容器的长度为num,若容器的长度变长,则以elem值填充新位置,如果容器变短则超出容器长度的原始将会被删除

#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;
}
//vector容器的容量和大小
void test01()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	printVector(v);

	//1.判断容器是否为空
	if (v.empty())
	{
		cout << "容器为空!" << endl;
	}
	else 
	{
		cout << "容器不为空!" << endl;
		//2.容器容量
		cout << "容器的容量为:" << v.capacity() << endl;//如果容器容量满了就可以开始动态扩展。提升容量
		//3.容器大小
		cout << "容器的大小为:" << v.size() << endl;
	}
	//3.重新设置容器大小,如果增加大小,则新位置用默认值填充,如果减小位置,则原始数据删除
	v.resize(15);//扩大容器的大小,使用默认值填充新位置
	printVector(v);
	//4.重新设置容器的大小,与3不同的是,使用指定值进行填充
	v.resize(8);
	printVector(v);
	v.resize(10,6);
	printVector(v);
}

int main()
{
	test01();
}

3.2.5 vector插入和删除

  功能描述:对vector容器进行
  (1)插入(v.insert())
  (2)删除(v.erase()

  函数原型:
  (1)push_back(elem);——尾部插入元素elem
  (2)pop_back();——删除最后一个元素
  (3)insert(const_iterator pos,ele);——迭代器指向位置pos插入元素
  (4)insert(const_iterator pos,int count,elem);——迭代器指向位置pos插入count个元素elem
  (5)erase(const_iterator pos);——删除迭代器指向元素
  (6)erase(const_iterator start,const_iterator end);——删除迭代器从start到end之间的元素
  (7)clear();——删除容器中所有元素

#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;
}
void test01()
{
	vector<int>v1;
	//1.vector容器尾部插入元素:push_back(elem);
	v1.push_back(10);
	v1.push_back(12);
	v1.push_back(14);
	v1.push_back(41);
	printVector(v1);

	//2.vector容器删除尾部最后一个元素:pop_back();
	v1.pop_back();
	printVector(v1);

	//3.迭代器指定位置插入元素:insert(const_iterator pos,ele)
	v1.insert(v1.begin(), 100);//头部位置插入100
	printVector(v1);

	//4.迭代器指向位置插入count个elem:insert(const_iterator pos,int count,elem);
	v1.insert(v1.begin(), 2, 11);
	printVector(v1);

	//5.删除迭代器指向元素:erase(const_iterator pos);
	v1.erase(v1.begin());
	printVector(v1);

	//6.删除迭代器从start到end之间的元素:erase(const_iterator start,const_iterator end);
	v1.erase(v1.begin(), v1.end());
	printVector(v1);

	//7.清空容器clear();
	vector<int>v2;
	v2.push_back(10);
	v2.push_back(12);
	v2.clear();
	printVector(v2);

	
}
int main()
{
	test01();
}

3.2.6 vector数据存储

  功能描述:对vector容器存取操作
  函数原型:
  (1)at(int idx);——返回索引idx所指向的数据
  (2)operator[];——返回索引idx所指的数据
  (3)front();——返回容器中第一个数据元素
  (4)back();——返回容器中最后一个数据元素

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

void test01()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//1.返回索引指向的数据:at(idx)
	for (int i = 0; i < v.size(); i++)
	{
		cout<<v.at(i)<<" ";
	}
	cout << endl;
	//2.liyong 【】方式,返回索引idx所指向的数据
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	//3.返回容器中第一个数据元素:front()
	cout << "第一个数据元素:" << v.front() << endl;

	//4.返回容器中最后一个数据元素:v.back()
	cout << "最后一个数据元素:" << v.back() << endl;

}
int main()
{
	test01();
}

3.2.7 vector互换容器

  功能描述:实现两个容器内元素进行互换(v.swap(vec)
  函数原型:
  swap(vec);——将vec与本身的元素互换

#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;
}
void test01()
{
	//1.容器1
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);
	//2.容器2
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v2.push_back(i+11);
	}
	printVector(v2);
	cout << "两个容器互换!" << endl;
	v1.swap(v2);
	printVector(v1);
	printVector(v2);
}
//实际用途:巧用swap可以收缩内存空间
void test02()
{
	vector<int> v2;
	for (int i = 0; i < 100000; i++)
	{
		v2.push_back(i);
	}
	cout << "v的容量为:" << v2.capacity() << endl;//138255
	cout << "v的大小为:" << v2.size() << endl;//100000

	cout << "重新指定大小!!!!!!!!!!!!!!!!!!!!!" << endl;
	v2.resize(3);
	cout << "v的容量为:" << v2.capacity() << endl;//138255
	cout << "v的大小为:" << v2.size() << endl;//3

	cout << "使用swap收缩内存!!!!!!!!!!!!!!!!!!!!!" << endl;
	vector<int>(v2).swap(v2);
	cout << "v的容量为:" << v2.capacity() << endl;//138255
	cout << "v的大小为:" << v2.size() << endl;//3
}
int main()
{
	test01();
	test02();
}

3.2.8 vector预留空间

  功能描述:减少vector在动态扩展容量时的扩展次数
  函数原型:
  reserve(int len);——容器预留len元素长度,预留位置不初始化,元素不可访问。

#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;
}
void test01()
{
	vector<int> v1;

	int num = 0;//统计开辟次数
	int* p = NULL;

	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
		if (p != & v1[0])
		{
			p = &v1[0];
			num++;
		}
	}
	cout << "num=" << num << endl;
}
 
int main()
{
	test01();
}

  总结:如果数据量较大,可以一开始利用reserve预留空间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值