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

map、multimap的元素由(key,value)二元组构成,其中键必须是唯一的
-
set、multiset相当于叧有键(key),没有对应值(value)的map和mulitimap -
set支持通过键实现的快速读取,元素唯一

-
multiset支持同一个键多次出现的set类型

关联容器与序列容器的差别
- 关联容器是通过键(key)存储和读取元素,是无序的
- 顺序容器则通过元素在容器中的位置顺序存储和访问元素。
map和set的底层机制都是通过一种称为“红黑树”的数据结构存取数据,这使得它们的数据存取效率相当高
map容器的操作
pair类型
- pair 类定义在
<utility>头文件中。pair 是一个类模板,它将两个值组织在一起,这两个值的类型可丌同。可以通过first和second公共数据成员来访问这两个值 - 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对象:
map<int, string> 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<<StuInfo[5] ; // 输出键 5 对应的值
在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 <iostream>
#include <string>
#include <utility>
#include <map>
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-堆栈
后进先出

-
栈是限制在结构的一端进行插入和删除操作
-
允许进行插入和删除操作的一端称为栈顶,另一端称为栈底
-
编程时加入下列语句:
#include<stack> -
栈的常用函数有:
push(elem)将元素elem入栈pop()栈顶元素出栈top()求栈顶元素empty()判断栈是否空size()求栈内元素个数
queue-队列
先进先出

-
叧能在一端进行插入、在另一端迚行删除操作的线性结构
-
编程时加入下列语句:
#include<queue> -
队列的常用函数有:
push()入队pop()出队front()读取队首元素back()读取队尾元素empty()判断队列是否空size()求队列长度
堆栈示例
#include<iostream>
#include<stack>
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
本文介绍了STL中的关联容器,如map、multimap、set和multiset,阐述了它们的特性和使用方法,包括pair对象、插入操作、迭代器和容器适配器如栈与队列的实例。
708

被折叠的 条评论
为什么被折叠?



