关联容器map

map是一种key-value关联的容器,第一个称为关键字,只能在map中出现一次,第二个称为关键字的值。

特点:map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

1、map是<键—值>对的集合 如:map< string ,int> word_count。map类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

2、记住!!!在vector < string,list< int > > 这种容器里边的类型也是容器的时候 >之间是有空格的,不然就变成>>运算符了

3、对于键类型,唯一的约束就是必须支持  < 操作符,其他不作要求。所以,不能拿(list 类型的迭代器)做键类型,因为(9.2节)list 的迭代器不支持算术运算,也不支持关系运算。它只支持前置和后置的自增、自减运算以及相等(不相等)运算。

4、value_type 该类型比之前介绍的容器所使用的元素类型要复杂的多,value_type是存储元素的键以及值的pair类型,且键为const类型,所以键初始化后是不能再赋值额。

在学习map的接口时,需要谨记value_type 是pair类型的,它的值成员可以修改,但键成员不能修改!!!!。

 注意:使用下标访问map与使用下标访问数组或者vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为下标值。

5.有别于vector或string类型,map下标操作符返回的类型和与对map迭代器进行解引用返回的类型不相同。

 显然,map迭代器返回value_type(pair类型)的值--包括const key_type 和mapped_type类型成员pair对象;下标操作符返回存储在map里面的值,是一个mapped_typed 的值。

map类额外定义了两种类型:key_type、mapped_type,以获得键或值的类

map对象的元素是键-值对,也即每个元素包括两个部分:键以及由关联的值。map的value_type 就反映了这个事实。

value_type是存储元素的键以及值的pair类型,且键为const类型。所以键初始化后是不能再被赋值的。

map<string,int> word_count;//空的map对象,由string类型的键索引,关联的值则为int类型。

如world_conunt数组的vlaue_type为pair。

       1.map迭代器进行解引用将产生pair类型的对象。

          对迭代器进行解引用时将产生一个引用,指向容器中一个value_type类型的值。对于map容器,其value_type是一个pair类型。

map<string,int>::iterator map_it=word_count.begin();//定义一个迭代器指向map容器的第一个元素。
cout<<map_it->first;//输出第一个位置的值-键
cout<<" "<<map_it->second;//输出值
map_it->first = "new key";//错误!!!!键是const类型的
++map_it->second;//通过迭代器修改值

三、给map容器添加元素

  • 定义了map容器后,下一步工作就是在容器中添加键—-值元素对,可以使用insert 成员实现,或者,先用下标操作符获取元素,然后给获取的元素赋值。在这种情况下,一个给定的键只能对应与一个元素。

四、使用下标访问map对象

    1.使用下标访问map与使用下标访问数组或者vector行为截然不同:使用下标访问不存在的元素将导致向map容器中添加一个新的元素,它的键即为下标。

     2.如同其他下标操作符一样,map的下标也使用索引(键)来获取该键所关联的值。如果键已经在容器中,则map的下标运算与vector的下标运算行为相同:返回该键所关联的值。

     3.只有在所查找的键不存在时,map容器才为该容器添加一个新的元素,并将它插入到map容器对象中。此时,所关联的值采用值初始化:类类型的元素采用默认构造函数初始化,而内置类型的元素则初始化为0.

map<string,int> word_count;
word_count["Anna"]=1;

上述代码发生了如下的事情:

在word_count 中查找键为Anna 的元素,没有找到

将一个新的键—值对插入到word_count中,它的键是const sring类型的对象,保存Anna。而它的值则采用值初始化,这就意味着在本例中值为 0

将这个新的键—值对插入到word_count中。

读取新插入的元素,并将它的值赋为1.

 //习题10.10

map<int,int> m;//首先创建一个空的map容器m,然后在m中增加一个键为0的元素,并将其赋值为1.

m[0] = 1;

vector<int< v;//空的容器

v[0] =1;//错误!!!vector不能通过下标进行初始化!!只能通过push_back, insert等增加元素.

 下标行为的编程意义

对于map容器,如果下标所表示的键在容器中不存在,咋添加新元素,这一特性可使程序员简练:

map<string,int> word_count;
string word;
while(cin>>word)
    ++word_count[word];
//这段程序用来记录每个单词出现的次数。while循环每次从标准输入中读入一个单词,如果这是新的单词,则在word_count中添加以该单词为索引的新元素。同时将它的值初始化为0、然后其值立即加1,所以每次在map中添加新元素时,所统计的出现次数正好从1开始。
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
int main()
{
    map<string,int> map_count;
    string word;
    while(cin>>word)
        ++map_count[word];
    for(map<string,int>::iterator iter=map_count.begin();iter !=map_count.end();iter++)
        {
            cout<<(*iter).first<<endl;//通过点运算符
            cout<<iter->second<<endl;//
        }
    return 0;
}

原文转载自:https://me.csdn.net/hlsdbd1990

原文作者:海螺上的斑点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值