计算机程序设计c++ 14-4:标准模板库STL-3

关联容器概览

关联容器的特征

STL提供了4个关联容器,包括:map (映射) 、multimap(多重映射) 、set (集合) 、multiset(多重集合)

计算机程序设计c++ 14-4:标准模板库STL-3_第1张图片

map、multimap的元素由(key,value)二元组构成,其中键必须是唯一的

  • setmultiset相当于叧有键(key),没有对应值(value)的 mapmulitimap

  • set支持通过键实现的快速读取,元素唯一
    在这里插入图片描述

  • multiset支持同一个键多次出现的set类型
    在这里插入图片描述

关联容器与序列容器的差别
  • 关联容器是通过键(key)存储和读取元素,是无序的
  • 顺序容器则通过元素在容器中的位置顺序存储和访问元素。

mapset的底层机制都是通过一种称为“红黑树”的数据结构存取数据,这使得它们的数据存取效率相当高

map容器的操作

pair类型
  • pair 类定义在 头文件中。pair 是一个类模板它将两个值组织在一起,这两个值的类型可丌同。可以通过 firstsecond 公共数据成员来访问这两个值
  • pair对象常常作为元素被添加到map中
  • pair对象的定义:
pair<int, string> mypair(5 , "Jack"); //调用构造函数
pair<int, string> otherPair ; // 直接赋值
otherPair.first = 6;
otherPair.second = "Mike";
  • 函数模板 make_pair( ) 能从两个变量构造一个 pair
pair<int, int > aPair = make_pair(5, 10) ;
map创建及添加元素
  • map 类定义在 头文件中
  • 创建map对象:
    map StuInfo;
    这就定义了一个用int作为键, 相关联string为值的map
  • 插入pair对象:
pair<int, string> mypair(1, "Tom");
StuInfo.insert(mypair);
StuInfo.insert(pair<int, string>(5, "Jack"));
map中使用运算符[]
  • [ ]操作符修改元素的值(键不可修改)
    StuInfo[1] = "Jim";
    因为键为 1 的元素存在,因此修改元素

  • [ ]操作符添加元素
    StuInfo[2] = "Lily";
    先查找主键为2的项,没找到,因此添加这个键为 2 的项

  • [ ]取得元素的值
    cout<

在map中查找元素
  • find()查找map中是否包含某个关键字
int target = 3;
map<int,string>::iterator it;
it = StuInfo.find(target); //查找关键字target
if( it == StuInfo.end() )
{
	cout << "not existed!"
}
else
{
	cout << "find it!"<<endl;
}

若查找成功则返回目标项的迭代器,否则返回StuInfo.end() 迭代器

在map中删除元素
  • 通过erase()函数按照关键字删除
//删掉关键字"1"对应的条目
int r = StuInfo.erase(1);

若删除成功,返回 1 ,否则返回 0

  • clear()清空map
    StuInfo.clear();

迭代器总结

STL 中的迭代器按功能由弱到强分为5种:

  • 输入:Input iterators 提供对数据的只读访问
  • 输出:Output iterators 提供对数据的只写访问
  • 正向:Forward iterators 提供读写操作,并能一次一个地向前推进迭代器
  • 双向:Bidirectional iterators提供读写操作,并能一次一个地向前和向后移动
  • 随机访问:Random access iterators提供读写操作,并能在数据中随机移动

编号大的迭代器拥有编号小的迭代器的所有功能,能当作编号小的迭代器使用

不同迭代器所能进行的操作

  • 所有迭代器: ++p, p++
  • 输入迭代器: *p, p = p1, p == p1 , p != p1
  • 输出迭代器: *p, p = p1
  • 正向迭代器: 上面全部
  • 双向迭代器: 上面全部,--p, p--,
  • 随机访问迭代器: 上面全部,以及:
    • p+= i, p -= i,
    • p+i 返回指向p后面的第i个元素的迭代器
    • p–i返回指向p前面的第i个元素的迭代器
    • p < p1, p <= p1, p > p1, p >= p1

容器所支持的迭代器类别

容器 迭代器类别
vector 随机
deque 随机
list 双向
set/multiset 双向
map/multimap 双向
stack 不支持迭代器
queue 不支持迭代器

关联容器支持双向迭代器,它支持:
*、++、--、=、==、!=

不支持:
<、<=、>=、>

map中迭代器的使用

下面迭代器中< 使用错误:

map<int, string> m;
map<int, string>::iterator it;
for(it = m.begin(); it < m.end(); it++)  //  map迭代器中不支持 <
{ 
	***** 
}

应该使用!=,正确

map<int,string> m;
map<int,string>::iterator it;
for(it = m.begin(); it != m.end(); it++)
{
	*****
}
#include 
#include 
#include 
#include 
using namespace std;

int main () {
	map	<int,string> StuInfo;

	StuInfo.insert(pair<int, string> (1, "Tom"));
	StuInfo.insert(pair<int, string> (5, "Jack"));
	StuInfo[2]="Lily";
	
	map<int,string>::iterator it;
	for(it = StuInfo.begin(); it != StuInfo.end(); it++)
		cout << (*it).first << " " << (*it).second << endl;
	
	return 0;
}

1 Tom
2 Lily
5 Jack

容器适配器概览

  • 容器适配器将其他容器加以包装、改造,变成新的容器。实质上是一种受限容器
  • 典型容器适配器:
    • stack(栈)
    • queue(队列)
stack-堆栈

后进先出

计算机程序设计c++ 14-4:标准模板库STL-3_第2张图片

  • 栈是限制在结构的一端进行插入和删除操作

  • 允许进行插入和删除操作的一端称为栈顶,另一端称为栈底

  • 编程时加入下列语句:
    #include

  • 栈的常用函数有:

    • push(elem) 将元素elem入栈
    • pop() 栈顶元素出栈
    • top() 求栈顶元素
    • empty() 判断栈是否空
    • size() 求栈内元素个数
queue-队列

先进先出
计算机程序设计c++ 14-4:标准模板库STL-3_第3张图片

  • 叧能在一端进行插入、在另一端迚行删除操作的线性结构

  • 编程时加入下列语句:
    #include

  • 队列的常用函数有:

    • push() 入队
    • pop() 出队
    • front() 读取队首元素
    • back() 读取队尾元素
    • empty() 判断队列是否空
    • size() 求队列长度
堆栈示例
#include
#include

using namespace std;

int main()
{
	stack<int> s; //定义栈s
	
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(9); //入栈

	cout << "栈顶元素:" << s.top() <<endl; //读栈顶元素
	cout << "元素数量:" << s.size() <<endl; //返回元素个数
	
	cout<<"出栈过程:";
	while(s.empty()!=true) //栈非空
	{
		cout << s.top() << " "; //读栈顶元素
		s.pop(); //出栈,删除栈顶元素
	}

	return 0;
}

栈顶元素:9
元素数量:4
出栈过程:9 3 2 1

你可能感兴趣的:(#,计算机程序设计c++,c++,容器,序列容器,关联容器,栈队列)