C++map和set的简单理解和使用案例

来源:互联网 发布:linux自建kms 编辑:程序博客网 时间:2024/05/14 14:17

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。来自:点击打开链接

set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值。

关于map的文档:点击打开链接

关于set的文档:点击打开链接

输出顺序按内部树的结构输出方式。

/* * 计算输入的不同单词的个数 * 运用map和set关联容器 * map的特点是其下标不必为整数(通过键来查值) * 如我们想知道对应的学生列表  姓名-学号  * 那我们可以用map<string,long> 利用姓名(string)就可以查出对应的值(long) *  * 下面的例子:输入5个string并输出对应字符串出现的次数 */#include <iostream>#include <map>#include <cstddef>#include <set>using namespace std;int main(){    map<string , size_t>word_count;//键值对,键和值的映射关系    string word;    int i=0;                //限制输入为5个string    while(1){        if(i++>4) break;        cin>>word;        ++word_count[word];//这里的word是指的输入的string串,不是一个数字索引,                            //word对应的字符串被当作键值对的键录入,并对键值对所对应的值(word_count[word])++操作;    }                       //这样对应的键值对                            //如果我将word_count[word]中的word改为word_count["word"]这样我的输入就都加到了word所对应的键值对了    for(auto &w:word_count)    cout << w.first <<"\t出现次数 "<< w.second<<endl;//first为保存关键字的数据成员,second为保存对应值的数据成员    return 0;}


下面是记录输入除set容器包含的键外的单词出现次数:

int main(){    map<string, size_t> word_count;    set<string> exclude={"the","a","an"                         "The","A","An"};    string word;    int i=0;    while(1){        if(i++>4) break;        cin>>word;        if(exclude.find(word) == exclude.end())//没有查到find会返回尾迭代器,证明没找到            ++word_count[word];    }    for(auto &w:word_count)    cout << w.first <<"\t出现次数 "<< w.second<<endl;    return 0;}