map的使用

STL 的头文件<map>中定义了模板类map multimap,用有序二叉树来存贮类型为pair<constKey, T>的元素对序列。序列中的元素以const Key部分作为标识,map 中所有元素的Key 值都必须是唯一的,multimap 则允许有重复的Key 值。

可以将map 看作是由Key 标识元素的元素集合,这类容器也被称为关联容器,可以通过一个Key 值来快速确定一个元素,因此非常适合于需要按照Key值查找元素的容器。map 模板类需要四个模板参数,第一个是键值类型,第二个是元素类型,第三个是比较算子,第四个是分配器类型。其中键值类型和元素类型是必要的。

map 的基本操作有:

1、定义map 对象,例如:

map<string, int> m;

要多次用时要注意清空map,用m.clear();

2、向map 中插入元素对,有多种方法,例如:

m[key] = value;

[key]操作是map 很有特色的操作,如果在map 中存在键值为key 的元素对,则返回该元素对的值域部分,否则将会创建一个键值为key 的元素对,值域为默认值。所以可以用该操作向map 中插入元素对或修改已经存在的元素对的值域部分。

m.insert( make_pair(key, value) );

也可以直接调用insert 方法插入元素对,insert 操作会返回一个pair,当map 中没有与key 相匹配的键值时,其first 是指向插入元素对的迭代器,其second true;若map 中已经存在与key 相等的键值时,其first 是指向该元素对的迭代器,second false

3、查找元素对,例如:

int i = m[key];

要注意的是,当与该键值相匹配的元素对不存在时,会创建键值为key 的元素

对。

map<string, int>::iterator it =m.find(key);

如果map 中存在与key 相匹配的键值时,find 操作将返回指向该元素对的迭

代器,否则,返回的迭代器等于map end()(参见vector 中提到的begin

end 操作)。

4、删除元素对,例如:

m.erase(key);

删除与指定key 键值相匹配的元素对,并返回被删除的元素的个数。

m.erase(it);

删除由迭代器it 所指定的元素对,并返回指向下一个元素对的迭代器。

看一段简单的示例代码:

#include<map>

#include<iostream>

using namespace std;

typedef map<int, string, less<int>> M_TYPE;//对于string类属于字符串,最好用cin和cout来输入输出,用scanf读时要取地址scanf("%s",&str)。

typedef M_TYPE::iterator M_IT;

typedef M_TYPE::const_iterator M_CIT;

int main(){

M_TYPE MyTestMap;

MyTestMap[3] = "No.3";

MyTestMap[5] = "No.5";

MyTestMap[1] = "No.1";

MyTestMap[2] = "No.2";

MyTestMap[4] = "No.4";

M_IT it_stop = MyTestMap.find(2);

cout << "MyTestMap[2] = "<< it_stop->second << endl;

it_stop->second = "No.2 Aftermodification";

cout << "MyTestMap[2] = "<< it_stop->second << endl;

cout << "Map contents : "<< endl;

for(M_CIT it = MyTestMap.begin(); it !=MyTestMap.end();

it++){

cout << it->second << endl;

}

return 0;

}

程序执行的输出结果为:

MyTestMap[2] = No.2

MyTestMap[2] = No.2 After modification

Map contents :

No.1

No.2 After modification

No.3

No.4

No.5

再看一段简单的示例代码:

#include <iostream>

#include <map>

using namespace std;

int main(){

map<string, int> m;

m["one"] = 1;

m["two"] = 2;

// 几种不同的insert 调用方法

m.insert(make_pair("three", 3));

m.insert(map<string,int>::value_type("four", 4));

m.insert(pair<string,int>("five", 5));

string key;

while (cin>>key){

map<string, int>::iterator it =m.find(key);

if (it==m.end()){

cout << "No such key!"<< endl;

}

else{

cout << key << " is "<< it->second << endl;

cout << "Erased " <<m.erase(key) << endl;//it->first为键值元素,it->second为值

}

}

return 0;

}

你可能感兴趣的:(map的使用)