c++ || STL序列容器

STL

Standard Template Library,标准模板库;STL借助模板吧常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。
vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。

STL组成结构

在这里插入图片描述

STL容器的种类和功能

容器种类 功能
序列容器 主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。之所以被称为序列容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。
排序容器 包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。
哈希容器 C++ 11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函数确定。

STL序列式容器

容器用于存放数据的类模板

迭代器(iterator)

  1. 不同容器的迭代器不同,功能强弱也不同
    迭代器的功能是遍历容器,在遍历的同时可以访问(修改)容器中的元素,但是不能初始化空的容器。

空容器的begin(),end()指向同一个位置,无法循环赋值

迭代器
输入迭代器 ~
输出迭代器 ~
前向迭代器 ++p,p++,*p,赋值,复制,==,!=,
双向迭代器 ++p,p++,*p,赋值,复制,==,!=,–p,p–
随机访问迭代器 ++p,p++,*p,赋值,复制,==,!=,–p,p–,p+=i(向后移动i个元素);p-=i;p+i(返回p后面第i个元素的迭代器);p-i;p[i](返回p后面第i个元素的引用),>,<

在这里插入图片描述

//array<int, 4>::iterator i;
//逐个输出元素
vector<int>::iterator i;//指针
	for (i = ar.begin(); i != ar.end(); i++)
	{
   
		cout << *i << " ";
	}
	cout << endl << "第三种" << endl;
	for (i = ar.begin(); i < ar.end(); i++)
	{
   
		cout << *i << " ";
	}
	cout << endl << "第四种" << endl;
	i = ar.begin();
	while (i < ar.end())
	{
   
		cout << *i << " ";
		i += 2;
	}
  1. 定义
    0
名称 功能
反向迭代器(reverse_iterator) 又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历
安插型迭代器(inserter或者insert_iterator) 通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator)流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator) 输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。
移动迭代器(move_iterator) 此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。

迭代器名:表示迭代器指向的元素

反向迭代器和正向迭代器的区别在于:
对正向迭代器进行 ++ 操作时,迭代器会指向容器中的后一个元素;
而对反向迭代器进行 ++ 操作时,迭代器会指向容器中的前一个元素。

int main()
{
   
	list<int> s{
    13,24,35,65,98 };
	list<int>::reverse_iterator i; //反向迭代器
	list<int>::const_iterator m;   //返回的是const属性 不能修改
	//逆向输出链表中的数据
	for (i = s.rbegin(); i != s.rend(); i++)
	{
    
		//rbegin() 最后一个元素 rend()第一个元素的前一个位置
		//i++   每次向左移动一个位置
		cout << *i << "  ";
	}
	i = s.rbegin();
	*i = 11;              //可以通过反向迭代器修改数据
	cout << endl;
	list<int>::iterator p;    //正向迭代器
	for (p = s.begin(); p != s.end(); p++)
	{
   
		cout << *p << "  ";
	}
	cout << endl;
	m = s.begin();
	 //*m = 00;   不能通过迭代器修改链表中的数据
	cout << *m << endl;
	return 0;
}

顺序容器

不会对存储的元素进行排序,元素排序的顺序取决于存储它们的顺序
在这里插入图片描述

函数成员 函数功能 array<T,N> vector< T> deque< T>
begin() 返回指向容器中第一个元素的迭代器
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin() 返回指向最后一个元素的迭代器
rend() 返回指向第一个元素所在位置前一个位置的迭代器
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值