map容器的一些方法说明

原创 2016年05月12日 23:38:45
#include <stdio.h>
#include <string>
#include <map>
#include <memory>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> dmap;
	dmap.insert(pair<int, int>(3, 1));
	dmap.insert(pair<int, int>(4, 1));
	dmap.insert(pair<int, int>(5, 1));
	dmap.insert(pair<int, int>(6, 1));
	//count函数计算map中指定key的元素有多少个
	printf("count key[%d], num: %d\n", 3, dmap.count(3));
	printf("count key[%d], num: %d\n", 9, dmap.count(9));
	//size函数计算map中的元素数量
	printf("%d\n", dmap.size());
	//max_size计算map中最多容纳的元素
	printf("%0x\n", dmap.max_size());
	//empty检查map是否为空
	printf("%d\n", dmap.empty());
	dmap.erase(dmap.begin(), dmap.end());
	printf("%d\n", dmap.empty());
	getchar();
	return 0;
}

运行结果为:

count key[3], num: 1
count key[9], num: 0
4
aaaaaaa
0
1


[]运算符:

#include <stdio.h>
#include <string>
#include <map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> imap;
	map<int, string> smap;
	imap[1] = 1;
	smap[1] = "hello";
	printf("imap[%d] = %d\n", 1, imap[1]);
	printf("smap[%d] = %s\n", 1, smap[1].c_str());
	printf("imap[%d] = %d\n", 2, imap[2]);
	printf("smap[%d] = %s\n", 2, smap[2].c_str());
	getchar();
	return 0;
}

运算结果为:

imap[1] = 1
smap[1] = hello
imap[2] = 0
smap[2] =

#include <stdio.h>
#include <string>
#include <map>
using namespace std;

class A
{
public:
	A() { m_a = -1; }
	A(int a) { m_a = 100; }
	int m_a;
};

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, A> imap;
	A a = A(1);
	imap[1] = a;
	A b = imap[1];
	printf("%d\n", b.m_a);
	A c = imap[10];
	printf("%d\n", c.m_a);

	getchar();
	return 0;
}
运算结果为:

100
-1

结果分析:下标运算符可以在map中取得key对应的value,如果key不存在,会返回一个对应类型的默认值。


#include <stdio.h>
#include <map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> imap;
	int i = imap[1];
	map<int, int>::iterator iter = imap.begin();
	for (; iter != imap.end(); iter++)
		printf("%d, %d\n", iter->first, iter->second);
	getchar();
	return 0;
}

运行结果为:

1, 0

分析:如果以key为键的元素并不在map中的话, [key]会导致在map中自动插入一个元素


find函数使用

#include <stdio.h>
#include <string>
#include <map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> imap;
	imap[1] = 1;
	imap[2] = 4;
	imap[3] = 8;
	map<int, int>::iterator iter = imap.find(1);
	if (iter != imap.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	else
		printf("iter end\n");

	iter = imap.find(10);
	if (iter != imap.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	else
		printf("iter end\n");

	getchar();
	return 0;
}

运行结果为:

iter->first: 1, iter->second: 1
iter end

分析: find返回一个迭代器, 它指向查找的key对应的元素,如果key不存在,则返回map.end()


at函数

#include <stdio.h>
#include <string>
#include <map>
#include <memory>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> imap;
	imap[1] = 1;
	imap[2] = 4;
	imap[3] = 8;
	int i = imap.at(1);      //返回1
	printf("%d\n", i);
	i = imap.at(10);         //出错,at方法中检测到访问不存在的key,会引发异常
	printf("%d\n", i);

	getchar();
	return 0;
}

分析:at的用法和[]类似,不过[]访问不存在的key会返回类型空值,at则会程序崩溃


swap方法:

#include <stdio.h>
#include <string>
#include <map>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	map<int, int> imap1;
	map<int, int> imap2;
	imap1[1] = 1;
	imap1[2] = 2;
	imap2[3] = 3;
	imap2[4] = 4;
	imap1.swap(imap2);
	map<int, int>::iterator iter = imap1.begin();
	for (; iter != imap1.end(); ++iter)
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	printf("\n");
	iter = imap2.begin();
	for (; iter != imap2.end(); ++iter)
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	getchar();
	return 0;
}

运行结果为:

iter->first: 3, iter->second: 3
iter->first: 4, iter->second: 4

iter->first: 1, iter->second: 1
iter->first: 2, iter->second: 2

分析:swap可以对调两个map中的内容,但是有一个前提,就是两个map必须使用相同的模板类实例,上面程序如果map<double, double> imap2编译会出错,swap返回值为void


map的初始化和赋值

	map<int, int> imap1;
	map<int, int> imap2(imap1);
	map<int, int> imap3(imap2.begin(), imap2.end());
	map<int, int> imap4 = imap1;
	map<int, int> imap5;
	imap5 = imap1;
	map<int, int> imap6({ pair<int, int>(1, 1), pair<int, int>(2, 2) }); //initializer_list方式初始化


排序:

#include <stdio.h>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <memory>
using namespace std;

bool Comp(const pair<string, int>& a, const pair<string, int>& b)
{
	return a.second < b.second;
}

int _tmain(int argc, _TCHAR* argv[])
{
	map<string, int> s_map;
	s_map["a"] = 19;
	s_map["b"] = 12;
	s_map["c"] = 10;
	//按key排序
	map<string, int>::iterator iter = s_map.begin();
	for (; iter != s_map.end(); ++iter)
		printf("%s: %d\n", iter->first.c_str(), iter->second);
	printf("\n");

	vector<pair<string, int>> s_vec(s_map.begin(), s_map.end());
	for (int i = 0; i < s_vec.size(); i++)
		printf("%s: %d\n", s_vec[i].first.c_str(), s_vec[i].second);
	printf("\n");
	//按值排序
	sort(s_vec.begin(), s_vec.end(), Comp);
	for (int i = 0; i < s_vec.size(); i++)
		printf("%s: %d\n", s_vec[i].first.c_str(), s_vec[i].second);
	printf("\n");
	getchar();
	return 0;
}

运行结果如下:

a: 19
b: 12
c: 10

a: 19
b: 12
c: 10

c: 10
b: 12
a: 19


为DataGrid添加自动编号功能

为DataGrid添加自动编号功能http://lucky_elove.www1.dotnetplayground.com/下面的代码实现在DataGrid中添加自动编号的功能,主要是在数据绑定时利用...
  • net_lover
  • net_lover
  • 2003-06-03 07:49:00
  • 2962

map容器的详细用法

map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候...
  • kavu1
  • kavu1
  • 2016-10-06 17:28:00
  • 2674

stl之map容器的原理及应用

容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来。map容器是一种关联容器,实现了SortedAs...
  • u010418035
  • u010418035
  • 2015-07-05 12:21:47
  • 7829

Map容器的使用

最全的c++map的用法 此文是复制来的0.0 1. map最基本的构造函数; mapmapstring; mapmapint; mapmapstring; mapmapchar; mapmapc...
  • baidu_23955875
  • baidu_23955875
  • 2015-06-09 12:51:30
  • 1187

C++map容器用法

1. map最基本的构造函数; [cpp] view plain copy mapint>mapstring; mapint,string >map...
  • yiyuqingning
  • yiyuqingning
  • 2016-08-04 11:40:04
  • 386

【C++】STL常用容器总结之八:映射map

9、映射mapMap是键-值对的集合,map中的所有元素都是pair,可以使用键作为下标来获取一个值。Map中所有元素都会根据元素的值自动被排序,同时拥有实值value和键值key,pair的第一元素...
  • hero_myself
  • hero_myself
  • 2016-08-25 12:20:54
  • 2043

map容器插入数据的4种方法

在构造map容器后,我们就可以往里面插入数据了。这里讲四种插入数据的方法: 第一种:用insert函数插入pair数据:在VC下请加入这条语句,屏蔽4786警告 #pragma warning (d...
  • cbNotes
  • cbNotes
  • 2017-08-02 18:56:50
  • 1219

c++ stl中map容器的基本用法

std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能 力,由于这个特性,它完成有可能在我们处理一对一...
  • zzuchengming
  • zzuchengming
  • 2016-03-17 15:31:49
  • 913

map容器的一些用法

看了好多人写的对map的排序 看得不太懂吧  自己写一些 map set multiset 三个容器都是 放进去 都是事先都要排序的 所以 erase insert find操作都是二分 复杂度都是l...
  • xky140610205
  • xky140610205
  • 2016-08-24 14:47:32
  • 757

c++map容器介绍

.  Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!    1、map简介 map是一类关联式...
  • chao_xun
  • chao_xun
  • 2012-10-03 10:32:19
  • 7669
收藏助手
不良信息举报
您举报文章:map容器的一些方法说明
举报原因:
原因补充:

(最多只允许输入30个字)