C++之初识STL—vector

STL基本概念

  • STL(Standard Template Library,标准模板库)
  • STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
  • 迭代器:算法通过迭代器访问容器里面的数据
  • 容器和算法之间通过迭代器进行无缝连接。
  • STL 几乎所有的代码都采用了模板类或者模板函数,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会

使用STL的好处

  • STL是C++的一部分,因此不需要额外安装什么,被内建在你的编译器里面
  • STL的一个重要特点是将数据结构和算法分离
  • 程序员不用思考STL的实现过程
  • STL具有高可用性,高性能,高移植,跨平台优点

容器

序列式容器:

  • 序列式容器每个元素都有固定位置–取决于插入的时机和地点,和元素值无关。
  • vector,deque、list、stack、queue

关联式容器:

  • 元素位置取决于特定的排序准则,和插入顺序无关
  • set、multiset、map、multimap

在这里插入图片描述
在这里插入图片描述

vector

1.vector容器简介

  • 尾部插入速度比较快
  • vector是将元素置于一个动态数组中加以管理的容器
  • vector可以随机存取元素(支持索引值直接存取)
  • vector尾部添加或移除元素的速度非常快速,但是在头部插入或移除元素比较费时

2.vector对象的默认构造函数

vector<class T>vecT;
vector<int>vecInt;
vector<float>vecFloat;
vector<string>vecString;

class A{};
vector<A>vecA; //用于存放CA对象的vector容器,
//由于容器元素的存放是按值复制的方式进行,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常

vector<A*>vecpA;   //用于存放CA对象指针的vector容器

3.vector对象的带参构造函数

理论知识:

  • vector(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身,注意该区间左闭右开
  • vector(n,elem);//构造函数将n个elem拷贝给本身
  • vector(const vector& vec); //拷贝构造函数
int main()
{
	int arr[] = { 1,2,3,4,5 }; //用两个指针构造
	vector<int>v1(arr, arr + 5);

	vector<int>v2(3, 10);//存储3个10
	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
	vector<int>v3(v1);//用一个已经构造好的对象初始化新的对象
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v3[i] << " ";
	}
}

在这里插入图片描述

4.vector的赋值

  • vector.assign(beg,end);//将[beg,end)区间中的元素拷贝赋值给本身,注意该区间左闭右开
  • vector.assign(n,elem);//将n个elem拷贝赋值给本身
  • vector& operator=(const vector& vec);//重载等号操作符
  • vector.swap(vec); //将vec与本身的元素互换
int main()
{
	vector<int>vecIntA(3, 10);
	vector<int> vecIntB, vecIntC, vecIntD;
	int iarray[] = { 0,1,2,3,4 };

	//将数组iarray中的所有元素赋值给vactorIntA容器
	vecIntA.assign(iarray, iarray + 5);
	cout << "A:";
	for (int i = 0; i < vecIntA.size(); i++)
	{
		cout <<vecIntA[i] << " ";
	}
	cout << endl;

	//将vecIntA中所有元素赋值给vecIntB
	vecIntB.assign(vecIntA.begin(), vecIntA.end());
	cout << "B1:";
	for (int i = 0; i < vecIntB.size(); i++)
	{
		cout <<vecIntB[i] << " ";
	}
	cout << endl;

	cout << "B2:";
	vecIntB.assign(vecIntA.begin()+2, vecIntA.end()-1);
	for (int i = 0; i < vecIntB.size(); i++)
	{
		cout << vecIntB[i] << " ";
	}
	cout << endl;

	//将4个10拷贝到vecIntC
	vecIntC.assign(4, 10);
	cout << "C:";
	for (int i = 0; i < vecIntC.size(); i++)
	{
		cout<< vecIntC[i] << " ";
	}
	cout << endl;

	//互换元素
	vecIntB.swap(vecIntC);
	cout << "B2:";
	for (int i = 0; i < vecIntB.size(); i++)
	{
		cout <<vecIntB[i] << " ";
	}
	cout << endl;

	cout << "C:";
	for (int i = 0; i < vecIntC.size(); i++)
	{
		cout << vecIntC[i] << " ";
	}
	cout << endl;

	//重载赋值运算符
	vecIntD = vecIntC;
	cout << "D:";
	for (int i = 0; i < vecIntD.size(); i++)
	{
		cout << vecIntD[i] << " ";
	}
	return 0;
}

在这里插入图片描述

5.vector的大小

  • vector.size(); //返回容器中元素的个数
  • vector.empty(); //判断容器是否为空
  • vector.resize(); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
  • vector.resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
int main()
{
	vector<int>v1;
	cout << "v1.size: " <<v1.size()<< endl;
	if (v1.empty()) //判断容器是否为空
	{
		cout << "v1 is empty" << endl;
	}

	int array[] = { 1,2,3,4,5 };
	v1.assign(array, array + 5);

	//将容器的长度变长
	v1.resize(10);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//将容器长度变短
	v1.resize(3);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//将容器长度变长,并且扩展出来的新的元素为指定的值
	v1.resize(10, 100);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

6.vector容器的访问方式

  • vec.at[idx]; //返回索引idx所指数据,如果idx越界,抛出out_of_range异常
  • vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错
    在这里插入图片描述

7.vector的插入

  • 在vector末尾进行插入:push_back、在末尾删除元素:pop_back
  • vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
  • vector.insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值
  • vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
int main()
{
	int arr[] = { 1,2,3,4,5 };
	vector<int>v1(arr, arr + 5);

	//在末尾插入函数
	v1.push_back(10);

	//在末尾删除函数
	v1.pop_back();

	//在指定位置插入一个指定元素
	v1.insert(v1.begin()+3,100); //注意第一个参数不能为下标,应该为指针
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//在指定的位置插入多个元素
	v1.insert(v1.begin() + 3, 3, 1000);//在下标为3的位置上插入3个1000
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//将指定的区间中的元素插入到指定的位置上,将50—80插入
	int b[] = { 40,50,60,70,80,90 };
	v1.insert(v1.begin() + 7, b + 1, b + 5);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淡蓝色的经典

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

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

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

打赏作者

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

抵扣说明:

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

余额充值