小言_互联网的博客

C++ SLT之map的用法总结

604人阅读  评论(0)

一、map的特点

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。

对于迭代器来说,可以修改实值,而不能修改key。

二、map的用法

1.map的定义及初始化

(1)map的定义
  • map< T,T> data;

    map<string , int >mapstring;      
    map<int ,string >mapint;
    map<sring, char>mapstring;         
    map< char ,string>mapchar;
    map<char ,int>mapchar;         
    map<int ,char >mapint;
    
(2) 初始化

map<int, string> Name = {
{ 2015, “Jim” },
{ 2016, “Tom” },
{ 2017, “Bob” } };
Name[2015] = “Tom”;

2.map的状态

  • bool empty(); // 查询map是否为空
  • size_t size();// 查询map中键值对的数量
  • size_t max_size();// 查询map所能包含的最大键值对数量,和系统和应用库有关。
    // 此外,这并不意味着用户一定可以存这么多,很可能还没达到就已经开辟内存失败了
  • size_t count( const Key& key ) const; // 查询关键字为key的元素的个数,在map里结果非0即1

3.map的操作

(1)迭代器操作
  • begin() 返回指向第一个元素的迭代器
  • end() 返回末尾的迭代器
  • rbegin() 返回指向第一个元素的逆向迭代器
  • rend() 指向list末尾的逆向迭代器
  • cbegin
  • cend
  • crbegin
  • crend

前四个和后四个的区别在于,后者一定返回 const_iterator,而前者则根据map的类型返回iterator 或者 const_iterator。const情况下,不允许对值进行修改。如下面代码所示

(2)插入操作
  • 用insert函数插入value_type数据
  • 用insert函数插入pair数据
  • 数组的方式
  • 用insert函数插入{}数组
#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<int,string> data={
        {1,"a"},
        {2,"b"}
    };
    data[3]='c';
    map<int,string>::iterator it;
    data.insert(pair<int,string>(4,"d"));
    data.insert(map<int,string>::value_type(-1,"z"));
    data.insert({{10,"4"}});//可以多个插入
    for(it=data.begin();it!=data.end();it++)
    {
        cout<<it->first<<' '<<it->second<<endl;
    }
}


以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,用程序说明

(3)删除操作
  • iterator erase(iterator it);//通过一个条目对象删除

  • iterator erase(iterator first,iterator last)//删除一个范围

  • size_type erase(const Key&key);//通过关键字删除

  • clear() //就相当于enumMap.erase(enumMap.begin(),enumMap.end());

(2)查找操作
  • 用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

  • iterator find (const key_type& k);
    const_iterator find (const key_type& k) const;
    // 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
    // 根据map的类型,返回的迭代器为 iterator 或者 const_iterator

    用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据
    所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返
    回的迭代器。查找map中是否包含某个关键字条目用find()方法,传入的参数是要查
    找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个
    条目和最后一个条目,这两个数据的类型是iterator.
    
  • 这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
    lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
    upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<int,string> data={
        {1,"a"},
        {2,"b"}
    };
    data[3]='c';
    map<int,string>::iterator it;
    data.insert(pair<int,string>(4,"d"));
    it=data.find(1);//查找关键字1,结果为find,==a
    if(it!=data.end())
    {
        cout << "find,=="<<it->second<<endl;
    }
    else
    {
        cout << "don't find"<<endl;
    }
    cout<<data.count(2);//查找关键字2,结果为1
}

operator: == != < <= > >=
注意 对于==运算符, 只有键值对以及顺序完全相等才算成立。


转载:https://blog.csdn.net/happen_if/article/details/100167963
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场