C++学习笔记八——顺序容器vector list deque

一 什么是顺序容器?
顺序容器内的元素按照其位置储存和访问。除顺序容器外,标准库还定义了几种关联容器,其元素按键(key)排序。例如 标准库vector 类型,这就是一种顺序容器,它将单一的类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。标准库定义了三种顺序容器的类型: vector list 和 deque。
以下为几种顺序容器类型

vector // 支持快速随机访问
list  //支持快速删除插入
deque //双端队列

1.1 顺序容器定义
在使用各种容器,必须先包含相关头文件

# include<vector>
# include <list>
# include<deque>

所有容器都是类模板,要定义某种特殊容器,必须在容器名后加一对尖括号,尖括号里面提供容器种存放的元素的类型。如以下定义

vector<int> a;
list<string> b;
deque<double> items;

1.2容器内元素初始化

vector<int> c;//创建一个名为c的vector容器,用于存放int 类型数据
vector<int> c(b);//创建容器b的副本c,c和b必须具有相同的容器类型,并存放相同类型的元素,适用于所有容器。
vector<int> c(n,t);  //用n个值为t的元素创建容器C,其中值t必须是容器c的元素类型的值。
vector<int> c(n);创建有n个值初始化元素容器C(只适用于顺序容器)

1.3初始化为一段元素的副本
尽管不能直接将一种容器内的元素赋值给另一种容器,但是系统允许通过传递一对迭代器间接实现功能。
迭代器标记了要复制元素的范围,这些元素用于初始化新容器的元素。迭代器标记要复制的第一个元素和最后一个元素。

list<string> slist(svec.begin(),svec.end());//svec为已经定义好的容器
int a[]={
    
    0,1,2,3,4,5}
vector<int> s(a,a+3);//s[0]=0,s[1]=1,s[2]=2,s[3]=3;

1.4 迭代器和迭代器范围
以前的文章中提到过 size_type 和 iterator 类型迭代器。所有容器的迭代器都支持以解引用运算从容器中读入一个元素。以下为常用的迭代器操作

*iter //返回迭代器iter所指向的元素引用
++iter //给iter加1,使其指向容器内下一个元素
--iter //给iter减1,使其指向容器的前一个元素

list容器的迭代器既不支持算术运算(加法或者减法),也不支持关系运算(<=,<,>=),它只提供前置和后置的自增,自减运算以及相等运算。
在c++primer 有一道题目,请逆序输出list容器内的元素,
如果你想尝试以下的方式输出

int a[] = {
    
    1,2,3,4,5,6};
	list<int> test(a, a + 2);
	int c = test.size();
	list<int>::iterator first = test.begin();
		while (first != test.end())
		{
    
    
			int i = 0;
			c = c - i;
			cout << *(first + c);
			first++;
			i++;
		}

那么会报错,报错的原因也提到过,list的迭代器不能进行加减操作,那么正确的方式如下

#include <iostream>
# include <string>
# include <vector>
# include <list>
using namespace std;
int main()
{
    
    
	int a[] = {
    
    1,2,3,4,5,6};
	vector<int> han(a,a+2);
	list<int> test(a, a + 6);
	list<int> ::iterator  first= test.begin();
	list<int> ::iterator  end = test.end();
	while (first != end)
	{
    
    
		cout << "the result is" << *(--end) << endl;
	}

}

运行的结果如图
在这里插入图片描述
1.5 顺序容器的的begin()和end()成员

c.begin() //返回一个迭代器,他指向容器c的第一个元素
c.front() //返回一个元素值,第一个元素的引用u
c.back() //返回容器c的最后一个元素的引用,最后一个元素的值,可以直接输出
c.end() //返回一个迭代器,它指向元素最后一个位置的下一个位置
c.at(0)//引用第一个元素,除了下标运用外也可以采取该方式

以前在顺序容器中添加元素提到过应用 : push_back,所有顺序容器都支持push_back,提供在容器尾部插入一个元素的功能。

c.push_back(t) //在容器c的尾部添加值为t的元素,返回void类型
c.push_front(t) //在容器c的前端添加值为t的元素,返回void类型
//只适用于list 和 deque容器类型

c.insert(p,t) //在迭代器p所指向的元素面前插入值为t的新元素。返回指向新添加元素的迭代器
c.insert(p,n,t)//在迭代器p所指向的元素面前插入n个值为t的元素,返回void类型
//插入一段元素
c.insert(p,b,e)//在迭代器P所指向的元素面前插入有迭代器b和e标记范围内的元素。返回void

1.6 容器大小操作

//顺序容器大小操作
c.size()// 返回容器中元素个数,返回的类型为 c::size_type
c.max_size() //返回容器c可容纳的最多元素个数,返回的类型为 c::size_type
c.resize(n) //调整容器c的长度大小,使其容纳n个元素,如果n<c.size(),则删除多余的元素。否则,添加采用值初始化的新元素。
c.empty() //返回标记容器大小是否为0的布尔值 

1.7删除元素

c.erase(p) //删除迭代器p所指向的元素,返回一个迭代器,指向被删除元素后面的元素,如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义
c.erase(b,e) //删除迭代器b和e所标记的范围内所有的元素,返回一个迭代器
c.clear() //删除容器内所有元素,返回void
c.pop_back(); //删除容器内最后一个元素
c.pop_front() //删除容器c的第一个元素。返回void

猜你喜欢

转载自blog.csdn.net/qq_41803340/article/details/108815887