2019年3月9日

1)map和multimap
如果说,set是一个只能放不重复元素并且自动排序的数组,那么map就相当于映射,里面的两个元素,比如:map<string,int>,这里的每个string和int是一一对应的。这个可以看作数学上的映射。
对于操作问题,就简单举例。
操作:

m.size() 返回容器大小
m.empty() 返回容器是否为空
m.count(k) 返回键值等于k的元素的个数
m.lower_bound(k) 返回键值等于k的元素的第一个可安插的位置
m.upper_bound(k) 返回键值等于k的元素的最后一个可安插的位置
m.begin() 指向第一个元素。
m.end() 指向最后一个元素的下一个 位置。
m.clear() 讲整个容器清空。
m.erase(k) 移除键值为k的所有元素,返回个数.
m.erase(s) 移除迭代器s所指位置上的元素。
直接元素存取:
m[k] = value;
查找的时候如果没有键值为k的元素,则安插一个键值为k的新元素,实值为一般为0。
m.insert(l) 插入一个元素l
a)运用value_type插入
map<string, float> m;
m.insert(map<string, float>:: value_type ("the", 2.3));
b) 运用pair<>
m.insert(pair<string, float>("the", 2.3));
c) 运用make_pair()
m.insert(make_pair("the", 2.3));

此外,在取map的值的时候,可以这样:

map<string, int> m;
m["one"] = 1;
map<string, int>::iterator p = m.begin();
p->first; // 这个是 string 值是 "one"
p->second; //这个是 int 值是 1

2)优先队列
所谓优先队列,与队列相似,但是又有区别。

优先队列不再遵循先入先出的原则,而是分为两种情况:
最大优先队列,无论入队顺序,当前最大的元素优先出队。
最小优先队列,无论入队顺序,当前最小的元素优先出队。

下面我来演示一下具体情况。
依次输入 4 1 7 6 2 5

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q;
int main()
{
    q.push(4),q.push(1),q.push(7),q.push(6),q.push(2),q.push(5);
    while(!q.empty())
        printf("%d ",q.top()),q.pop();
}

输出结果为:
7 6 5 4 2 1
对于priority_queue
还可以这样
priority_queue<Type, Container, Functional>
其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。
例如:

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

其他的,还可以重载运算符
如:

struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; 
    }
};
priority_queue<tmp1> d;

对于优先队列的基本操作

q.push(l) 将元素l置入优先队列
 q.top() 返回优先队列的下一个元素
 q.pop() 移除一个元素
 q.size() 返回队列中元素的个数
 q.empty() 返回优先队列是否为空

以上,便是最近讲的stl内容

猜你喜欢

转载自blog.csdn.net/qq_17679843/article/details/88371293