std::map 自定义key的排列和查找

std::map<key,value> 是根据key的"<"进行排序的,当使用struct做为key需要重载“<”符号,用于map的排序和查找。

#include <string>
#include <map>
#include <iostream>

typedef struct mapKey_s
{
	int ikey;
	std::string skey;
}mapKey;



bool operator<(const mapKey& lhs, const mapKey& rhs)
{
	//用sKey作为主要的排列
	if (lhs.skey != rhs.skey)
	{
		return lhs.skey < rhs.skey;
	}
	else if (lhs.ikey != rhs.ikey)
	{
		return lhs.ikey < rhs.ikey;
	}
	return false;
}

typedef std::map <mapKey,std::string> mapTest;

int _tmain(int argc, _TCHAR* argv[])
{
	mapTest maptest;
	int input;
	maptest[{10, "aaaa"}] = "dddd";
	maptest[{9, "bbbb"}] = "cccc";
	maptest[{6, "eeee"}] = "eeee";
	maptest[{8, "cccc"}] = "bbbb";
	maptest[{7, "dddd"}] = "aaaa";

	for each (auto tmp in maptest)
	{
		std::cout << tmp.first.skey << " " << tmp.first.ikey << " " << tmp.second << std::endl;
	}
	std::cin >> input;
	return 0;
}

输出

aaaa 10 dddd
bbbb 9 cccc
cccc 8 bbbb
dddd 7 aaaa
eeee 6 eeee

自动根据skey排列。

除了重载“<”也可以使用std::map的第三参数进行排列

#include "stdafx.h"
#include <string>
#include <map>
#include <iostream>


typedef struct mapKey_s
{
	int ikey;
	std::string skey;
}mapKey;

typedef struct mycmp_s {
	bool operator()(const mapKey &lhs, const mapKey &rhs)
	{
		//用sKey作为主要的排列
		if (lhs.skey != rhs.skey)
		{
			return lhs.skey < rhs.skey;
		}
		else if (lhs.ikey != rhs.ikey)
		{
			return lhs.ikey < rhs.ikey;
		}
		return false;
		
	}
}mycmp;

typedef std::map <mapKey, std::string, mycmp> mapTest2;

int _tmain(int argc, _TCHAR* argv[])
{
	mapTest2 maptest;
	int input;
	maptest[{10, "aaaa"}] = "dddd";
	maptest[{9, "bbbb"}] = "cccc";
	maptest[{6, "eeee"}] = "eeee";
	maptest[{8, "cccc"}] = "bbbb";
	maptest[{7, "dddd"}] = "aaaa";

	for each (auto tmp in maptest)
	{
		std::cout << tmp.first.skey << " " << tmp.first.ikey << " " << tmp.second << std::endl;
	}
	std::cin >> input;
	return 0;
}

输出

aaaa 10 dddd
bbbb 9 cccc
cccc 8 bbbb
dddd 7 aaaa
eeee 6 eeee

自动根据skey排列。

 

std::map的find是判断!(lhs < rhs) && !(rhs < lhs),使用上面的方法可以使用:

auto it = maptest.find({ 6, "eeee" });

查找对应key的iterator,但是要根据key或者value中的某一项来自定义查找规则就要使用find_if

#include "stdafx.h"
#include <string>
#include <map>
#include <iostream>
#include <algorithm>

typedef struct mapKey_s
{
	int ikey;
	std::string skey;
}mapKey;



bool operator<(const mapKey& lhs, const mapKey& rhs)
{
	//用sKey作为主要的排列
	if (lhs.skey != rhs.skey)
	{
		return lhs.skey < rhs.skey;
	}
	else if (lhs.ikey != rhs.ikey)
	{
		return lhs.ikey < rhs.ikey;
	}
	return false;
}

typedef std::map <mapKey,std::string> mapTest;

class map_finder
{
public:
	map_finder(const std::string &cmp_string) :m_findKey(cmp_string){}
	bool operator ()(const mapTest::value_type &pair)
	{
		return pair.first.skey == m_findKey;
	}
private:
	const std::string &m_findKey;
};

int _tmain(int argc, _TCHAR* argv[])
{
	mapTest maptest;
	int input;
	maptest[{10, "aaaa"}] = "dddd";
	maptest[{9, "bbbb"}] = "cccc";
	maptest[{6, "eeee"}] = "eeee";
	maptest[{8, "cccc"}] = "bbbb";
	maptest[{7, "dddd"}] = "aaaa";

	auto it = std::find_if(maptest.begin(), maptest.end(), map_finder("eeee"));
	if (it != maptest.end())
	{
		std::cout << it->first.skey << " " << it->first.ikey << " " << it->second << std::endl;
	}

	
	std::cin >> input;
	return 0;
}

输出
eeee 6 eeee

完成根据特点参数查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章