天天看点

STL学习之vector,deque,list

如码:

#include <iostream>
#include <vector>//随机访问 末尾插入删除----std::vector
#include <list> //双向列表
#include <deque>//双端队列 随机访问
#include <string>
#include <algorithm>//算法定义头文件
#include <numeric> //求和函数存在的头文件
using namespace std;

class Person
{
public:
	Person();
	Person(char *name)
	{
		this->name=name;
	}
	void showName()
	{
		cout<<"name ="<<name<<endl;
	}

private:
	char *name;


};



void TestVector()
{
	double data[]={1.2,3.4,5.5,4.2,6.4,7.8};
	vector<int> v1(100,-1);//初始化第一种,1参放数量,2参放初始化参量
	v1[2]=42;//随机访问 可直接修改元素
	v1.push_back(22);//在末尾添加元素
	vector<double> v2(data,data+4);//将数组元素初始化成矢量
	vector<double> v3(v2.begin(),v2.end()-1);//从别的矢量进行初始化
	
	cout<<"v1: size="<<v1.size()<<" capacity="<<v1.capacity()<<" v1[100]="<<v1[100]<<endl;
	cout<<"v2: size="<<v2.size()<<" capacity="<<v2.capacity()<<" v2[1]= "<<v2[1]<<endl;
	cout<<"v3: size="<<v3.size()<<" capacity="<<v3.capacity()<<" v3[1]= "<<v3[1]<<endl;

	/*
	begin() end() 两个迭代器 rbegin() rend()两个逆向迭代器 end指向的是最后一个元素的下一个位置
	*/
	auto len=v1.capacity();//获得容器当前的容量的容量
	auto size=v1.size();//获得容器的大小
	if(v2.empty())//判断是否为空
		cout<<"this vector is empty!"<<endl;

	//最大容量
	vector<string> strings;
	cout<<"the max size of the vector is "<<strings.max_size()<<endl;

	//改变大小
	vector<int> v4(5,66);
	v4.resize(6,88);//66 66 66 66 66 88
	v4.resize(7);//66 66 66 66 66 88 0
	v4.resize(4);//66 66 66 66 

	//访问元素--超过界限会抛出out_of_range异常
	cout<<" v1[1]= "<<v1.at(1)<<endl;

	//访问最前和最后一个元素
	int last=v1.back();
	cout<<" v1 first = "<<v1.front()<<" last ="<<v1.back()<<endl;
	last=0;
	cout<<" change last ="<<v1.back()<<endl;
	cout<<"添加一个元素 201"<<endl;
	v1.push_back(201);
	cout<<" v1 last = "<<v1.back()<<endl;

	//这种方式得来的元素不能修改
	const int& firstNumber=v1.front();
	const int& lastNumber=v1.back();

	//删除末尾元素-----clear()清空所有元素
	v1.pop_back();
	cout<<" 删除元素后 last ="<<v1.back()<<endl;

	//insert(index,number(可有可无,插入多少个相同元素),element)可在制定位置插入元素
	//erase()可删除指定位置的元素(start,end)可删除区间内元素

	vector<int> v5(3,66);
	vector<int> v6(4,77);
	cout<<"v5 : ";
	for(int i=0;i<v5.size();i++)
		cout<<v5.at(i)<<" ";
	cout<<endl;
	cout<<"v6 : ";
	for(int i=0;i<v6.size();i++)
		cout<<v6.at(i)<<" ";
	cout<<endl;
	//交换后
	v5.swap(v6);
	cout<<"v5 : ";
	for(int i=0;i<v5.size();i++)
		cout<<v5.at(i)<<" ";
	cout<<endl;
	cout<<"v6 : ";
	for(int i=0;i<v6.size();i++)
		cout<<v6.at(i)<<" ";
	cout<<endl;

	//assign(vector.start,vector.end)可换成vector中的区间内元素

	//vector不仅可以包含所有基本数据类型还能包含类类型

	//迭代器遍历
	vector<Person> v7;
	Person p1("zhangsan");
	Person p2("lisi");
	v7.push_back(p1);
	v7.push_back(p2);
	auto iter=v7.begin();
	while(iter!=v7.end())
		iter++->showName();


}

void dequeTest()
{
	//创建容器的方法与vector差不多 二三行可以取得它的迭代器与反转迭代器
	deque<int> data;
	deque<int> ::iterator iter;
	deque<int> ::reverse_iterator riter;

	cout<<"please enter the value,zero will stop enter!"<<endl;
	int value(0);

	while(cin>> value , value!=0)
		data.push_front(value);//在头部插入 push_back在末尾插入
	//用两种迭代器遍历
	cout<<"the values you enter!"<<endl;
	for(iter=data.begin();iter !=data.end();iter++)
		cout<<*iter<<" ";
	cout<<endl;

	cout<<"the values you enter!using reverse iter"<<endl;
	for(riter=data.rbegin();riter !=data.rend();riter++)
		cout<<*riter<<" ";
	cout<<endl;


	//把输入的进行排序
	cout<<endl<<"sort the value you input:"<<endl;
	sort(data.rbegin(),data.rend());
	//输出排序后
	cout<<"after the sort,value:"<<endl;
	for(iter=data.begin();iter !=data.end();iter++)
		cout<<*iter<<" ";
	cout<<endl;

	//算出总数
	cout<<"the sum of the data:"<<accumulate(data.begin(),data.end(),0)<<endl;

	/*容器的大致方法都是差不多的 和vector区别不大*/


}

void listTest()//双向链表 list不支持随机访问
{
	list<string> names;
	list<string> xbox(20);//empty of 20
	list<int> element(10,2);//ten elements are all 2
	//可以用size拿到容量 resize改变长度 与vector deque方法大体相同
	//可以使用push方法在头尾进行插入 也可以用insert方法在任意位置进行插入
	cout<<"the elements contain:"<<endl;
	for(auto iter =element.begin();iter!=element.end();iter++)
		cout<<*iter<<" ";

	element.insert(++element.begin(),30);//the second insert 30
	cout<<endl<<"after inserting :"<<endl;
	for(auto iter =element.begin();iter!=element.end();iter++)
		cout<<*iter<<" ";
	cout<<endl;


}