c++STL容器之序列式容器

目录

vector容器

vector对象的默认构造

vector的初始化

vector的遍历

vector的增删改查

vector末尾的添加移除操作  

vector的数据存取

deque容器

deque对象的默认构造

deque末尾的添加移除操作

deque的数据存取

 stack容器

stack对象的默认构造

stack的push()与pop()方法

stack对象的拷贝构造与赋值

stack的遍历

queue容器

queue容器的初始化及遍历

list容器

list头尾的添加移除操作

list的数据存取

list的插入

list的删除


序列式容器(Sequence containers)在c++中主要有三种:vector、deque、list 。

vector容器

  • vector是将元素置于一个动态数组中加以管理的容器。
  • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。

vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时。

vector对象的默认构造

vector采用模板类实现,vector对象的默认构造形式

vector<T> vecT;

vector<int> vecInt;         //一个存放int的vector容器。

vector<float> vecFloat;      //一个存放float的vector容器。

vector<string> vecString;    //一个存放string的vector容器。

...     //尖括号内还可以设置指针类型或自定义类型。

Class CA{};

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

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

vector的初始化

//vector的初始化
void main32()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	vector<int> v2 = v1;
	vector<int> v3(v1.begin(), v1.begin() + 2);
}

vector的遍历

主要有两种方式,数组方式遍历和迭代器方式的遍历。

void printV(vector<int>& v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
void main35()
{
	vector<int> v1(10);
	for (int i = 0; i < 10; i++)
	{
		v1[i] = i + 1;
	}

	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}

	cout << endl;
	//逆向遍历
	for (vector<int>::reverse_iterator rit = v1.rbegin();rit != v1.rend(); rit++)
	{
		cout << *rit << " ";
	}
}

vector的增删改查

vector末尾的添加移除操作  

vector<int> vecInt;

vecInt.push_back(1);  //在容器尾部加入一个元素

vecInt.push_back(3);  

vecInt.push_back(5);  

vecInt.push_back(7);

vecInt.push_back(9);

vecInt.pop_back();    //移除容器中最后一个元素

vecInt.pop_back();

//{5 ,7 ,9}  

vector的数据存取

vec.at(idx);   //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。

vec[idx];   //返回索引idx所指的数据,越界时,运行直接报错

vector<int> vecInt;    //假设包含1 ,3 ,5 ,7 ,9

vecInt.at(2) == vecInt[2] ; //5

vecInt.at(2) = 8;  或  vecInt[2] = 8;

vecInt 就包含 1, 3, 8, 7, 9值

int iF = vector.front(); //iF==1

int iB = vector.back(); //iB==9

vector.front() = 11; //vecInt包含{11,3,8,7,9}

vector.back() = 19; //vecInt包含{11,3,8,7,19}

//vector 删除
void main36()
{
	vector<int> v1(10);
	for (int i = 0; i < 10; i++)
	{
		v1[i] = i + 1;
	}

	//区间删除
	v1.erase(v1.begin(), v1.begin() + 3);
	printV(v1);

	//根据元素的位置删除
	v1.erase(v1.begin());
	printV(v1);

	//根据元素的值
	v1[1] = 2;
	v1[3] = 2;
	printV(v1);

	for (vector<int>::iterator it = v1.begin(); it != v1.end();)
	{
		if (*it == 2)
		{
			it = v1.erase(it);//当删除迭代器所指向的元素的时候,erease删除函数会让it自动下移动
		}
		else
		{
			it++;
		}
	}
	printV(v1);

	v1.insert(v1.begin(), 100);
	v1.insert(v1.end(), 200);
	printV(v1);
}

deque容器

  • deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
  • deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
  • deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。

deque对象的默认构造

deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT;  

deque <int> deqInt;            //一个存放int的deque容器。

deque <float> deq Float;     //一个存放float的deque容器。

deque <string> deq String;     //一个存放string的deque容器。

 //尖括号内还可以设置指针类型或自定义类型。

deque末尾的添加移除操作

  • deque.push_back(elem); //在容器尾部添加一个数据
  • deque.push_front(elem); //在容器头部插入一个数据
  • deque.pop_back();     //删除容器最后一个数据
  • deque.pop_front(); //删除容器第一个数

deque的数据存取

  • deque.at(idx);  //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
  • deque[idx];  //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
  • deque.front();   //返回第一个数据。
  • deque.back();  //返回最后一个数据
void main41()
{
	deque<int> d1;
	d1.push_back(1);
	d1.push_back(3);
	d1.push_back(5);

	d1.push_front(-11);
	d1.push_front(-33);
	d1.push_front(-55);
	printD(d1);

	cout << endl;
	cout << "头部元素:" << d1.front() << endl;
	cout << "尾部元素:" << d1.back() << endl;
	
	d1.pop_front();
	d1.pop_back();
	printD(d1);
	cout << endl;

	//查找-33在数组下标的值
	deque<int>::iterator it = find(d1.begin(), d1.end(), -33);
	if (it != d1.end())
	{
		cout << "-33数组下标是" << distance(d1.begin(), it) << endl;
	}
	else
	{
		cout << "没有找到值为-33的元素" << endl;
	}

}

 stack容器

  • stack是堆栈容器,是一种“先进后出”的容器。
  • stack是简单地装饰deque容器而成为另外的一种容器。

stack对象的默认构造

stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT;  

stack <int> stkInt;            //一个存放int的stack容器。

stack <float> stkFloat;     //一个存放float的stack容器。

stack <string> stkString;     //一个存放string的stack容器。

//尖括号内还可以设置指针类型或自定义类型。

//栈模型
//栈的算法和栈容器数据类型的分离
void main51()
{
	stack<int> s;

	//入栈
	for (int i = 0; i < 10; i++)
	{
		s.push(i + 1);
	}
	cout << "栈的大小" << s.size() << endl;

	//出栈
	while (!s.empty())
	{
		//获取栈顶元素
		int tmp = s.top();
		cout << tmp << " ";
		s.pop();//弹出栈顶元素
	}

}

stack的push()与pop()方法

stack.push(elem);   //往栈头添加元素

stack.pop();   //从栈头移除第一个元素

stack对象的拷贝构造与赋值

stack(const stack &stk);      //拷贝构造函数

stack& operator=(const stack &stk); //重载等号操作符

stack的遍历

void main52()
{
	Teacher5 t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;

	stack<Teacher5> s;
	s.push(t1);
	s.push(t2);
	s.push(t3);

	while (!s.empty())
	{
		Teacher5 tmp = s.top();
		tmp.prinT();
		s.pop();
	}
}

queue容器

  • queue是队列容器,是一种“先进先出”的容器。
  • queue是简单地装饰deque容器而成为另外的一种容器。

queue采用模板类实现,queue对象的默认构造形式:queue<T> queT;  如:

queue<int> queInt;            //一个存放int的queue容器。

queue<float> queFloat;     //一个存放float的queue容器。

queue<string> queString;     //一个存放string的queue容器。

//尖括号内还可以设置指针类型或自定义类型。

queue容器的初始化及遍历

//队列中基本数据类型
void main61()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);

	cout << "队头元素" << q.front() << endl;
	cout << "队列的大小" << q.size() << endl;
	
	while (!q.empty())
	{
		int tmp = q.front();
		cout << tmp << " ";
		q.pop();
	}
}

list容器

  • list是一个双向链表容器,可高效地进行插入删除元素。
  • list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It++(ok) it+5(err)

list采用采用模板类实现,对象的默认构造形式:list<T> lstT;  如:

list<int> lstInt;            //定义一个存放int的list容器。

list<float> lstFloat;     //定义一个存放float的list容器。

list<string> lstString;     //定义一个存放string的list容器。

//尖括号内还可以设置指针类型或自定义类型。

list头尾的添加移除操作

  • list.push_back(elem);    //在容器尾部加入一个元素
  • list.pop_back();              //删除容器中最后一个元素
  • list.push_front(elem);     //在容器开头插入一个元素
  • list.pop_front();              //从容器开头移除第一个元素

list的数据存取

  • list.front();   //返回第一个元素。
  • list.back();  //返回最后一个元素。
void main71()
{
	list<int> l;
	cout << "list的大小:" << l.size() << endl;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);//尾部插入元素 尾插法
	}
	cout << "list的大小:" << l.size() << endl;

	list<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//lsit不能随机访问
	it = l.begin();
	it++;
	it++;
	it++;
	//it += 5; 不支持随机的访问容器
	l.insert(it, 100);//100插入在什么位置
	
	for (list<int>::iterator it = l.begin(); it != l.end(); it++)
	{
		cout << *it << " ";
	}

	//结论1:链表的结点的index序号是从0号位置开始
	//结论2:在3号位置插入元素,是让原来的3号位置变成4号位置 原来的4号位置变成5号位置
	
}

list的插入

  • list.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • list.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
  • list.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。

list的删除

  • list.clear(); //移除容器的所有数据
  • list.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
  • list.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

lst.remove(elem);   //删除容器中所有与elem值匹配的元素

//list删除
void main72()
{
	list<int> l;
	cout << "list的大小:" << l.size() << endl;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);//尾部插入元素 尾插法
	}
	cout << "list的大小:" << l.size() << endl;

	list<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	list<int>::iterator it1 = l.begin();
	list<int>::iterator it2 = l.begin();
	it2++;
	it2++;
	it2++;


	l.erase(it1, it2);
	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	l.erase(l.begin());

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	l.remove(100);

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_45526401/article/details/130183977