STL提供了4个关联容器,包括:map (映射) 、multimap(多重映射) 、set (集合) 、multiset(多重集合)
map、multimap
的元素由(key,value)二元组构成,其中键必须是唯一的
set
、multiset
相当于叧有键(key),没有对应值(value)的 map
和 mulitimap
map
和set
的底层机制都是通过一种称为“红黑树”的数据结构存取数据,这使得它们的数据存取效率相当高
头文件中。pair 是一个类模板,它将两个值组织在一起,这两个值的类型可丌同。可以通过 first
和 second
公共数据成员来访问这两个值pair<int, string> mypair(5 , "Jack"); //调用构造函数
pair<int, string> otherPair ; // 直接赋值
otherPair.first = 6;
otherPair.second = "Mike";
make_pair( )
能从两个变量构造一个 pairpair<int, int > aPair = make_pair(5, 10) ;
头文件中map StuInfo;
pair<int, string> mypair(1, "Tom");
StuInfo.insert(mypair);
StuInfo.insert(pair<int, string>(5, "Jack"));
用[ ]
操作符修改元素的值(键不可修改)
StuInfo[1] = "Jim";
因为键为 1 的元素存在,因此修改元素
用[ ]
操作符添加元素
StuInfo[2] = "Lily";
先查找主键为2的项,没找到,因此添加这个键为 2 的项
用[ ]
取得元素的值
cout<
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() 迭代器
erase()
函数按照关键字删除//删掉关键字"1"对应的条目
int r = StuInfo.erase(1);
若删除成功,返回 1 ,否则返回 0
clear()
清空mapStuInfo.clear();
STL 中的迭代器按功能由弱到强分为5种:
编号大的迭代器拥有编号小的迭代器的所有功能,能当作编号小的迭代器使用
不同迭代器所能进行的操作
++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<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(队列)
后进先出
栈是限制在结构的一端进行插入和删除操作
允许进行插入和删除操作的一端称为栈顶,另一端称为栈底
编程时加入下列语句:
#include
栈的常用函数有:
push(elem)
将元素elem
入栈pop()
栈顶元素出栈top()
求栈顶元素empty()
判断栈是否空size()
求栈内元素个数叧能在一端进行插入、在另一端迚行删除操作的线性结构
编程时加入下列语句:
#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