map容器的一些方法说明

#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


map容器是C++ STL中的关联容器之一,它提供了基于键值对的映射关系(key-value)存储数据的功能。以下是关于map容器的详细使用说明: 1. 引入头文件 ```c++ #include <map> ``` 2. 定义map容器 ```c++ std::map<Key, Value> myMap; ``` 其中,Key表示键的类型,Value表示值的类型。例如,如果想存储字符串类型的键,整数类型的值,可以这样定义: ```c++ std::map<std::string, int> myMap; ``` 3. 插入元素 可以使用insert函数或[]运算符插入元素: ```c++ // 使用insert函数插入元素 myMap.insert(std::make_pair("apple", 1)); // 使用[]运算符插入元素 myMap["orange"] = 2; ``` 注意,如果使用[]运算符插入元素,如果键不存在,则会创建一个新的键值对;如果键已经存在,则会覆盖原有的值。 4. 删除元素 可以使用erase函数删除指定键的元素: ```c++ myMap.erase("apple"); ``` 5. 访问元素 可以使用find函数查找指定键的元素,如果找到了,则返回键所对应的迭代器;如果没找到,则返回end迭代器: ```c++ auto it = myMap.find("orange"); if (it != myMap.end()) { std::cout << it->first << ": " << it->second << std::endl; } ``` 可以使用[]运算符访问键所对应的值: ```c++ std::cout << myMap["orange"] << std::endl; ``` 注意,如果访问不存在的键,则会创建一个新的键,并将其值初始化为类型的默认值。 6. 遍历元素 可以使用迭代器遍历map容器中的元素: ```c++ for (auto it = myMap.begin(); it != myMap.end(); ++it) { std::cout << it->first << ": " << it->second << std::endl; } ``` 7. 判断元素是否存在 可以使用count函数判断指定键的元素是否存在,如果存在,则返回1;如果不存在,则返回0: ```c++ if (myMap.count("orange") > 0) { std::cout << "orange exists" << std::endl; } ``` 以上就是关于map容器的详细使用说明。需要注意的是,在处理大量数据时,map容器的效率可能会比较低,因为map容器是基于红黑树实现的,插入、查找、删除等操作的时间复杂度是O(logn)。如果需要处理大量数据,并且对时间性能有很高的要求,可以考虑使用unordered_map容器,它是基于哈希表实现的,插入、查找、删除等操作的时间复杂度是O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值