C++ 特性之map详解 + 联合opencv使用

1.map简介

  • map是STL的一个关联容器,它提供一对一的hash:

    • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
    • 第二个可能称为该关键字的值(value);
  • map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。
    在这里插入图片描述

  • 常用函数:

//C++ maps是一种关联式容器,包含“关键字/值”对
begin()         返回指向map头部的迭代器
clear()        删除所有元素
count()         返回指定元素出现的次数
empty()         如果map为空则返回true
end()           返回指向map末尾的迭代器
equal_range()   返回特殊条目的迭代器对
erase()         删除一个元素
find()          查找一个元素
get_allocator() 返回map的配置器
insert()        插入元素
key_comp()      返回比较元素key的函数
lower_bound()   返回键值>=给定元素的第一个位置
max_size()      返回可以容纳的最大元素个数
rbegin()        返回一个指向map尾部的逆向迭代器
rend()          返回一个指向map头部的逆向迭代器
size()          返回map中元素的个数
swap()           交换两个map
upper_bound()    返回键值>给定元素的第一个位置
value_comp()     返回比较元素value的函数
  • 基本使用
*****************************插入元素********************************************
// 定义一个map对象
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
 
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
 
// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

*****************************查找元素********************************************
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

*****************************删除与清空********************************************
//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

联合opencv使用

  • case1:
//test1
	//define key
	std::vector<int>v1{
    
     1,2,3 };
	std::vector<int>v2{
    
     2,3,4 };
	std::vector<int>v3{
    
     3,4,5 };
	std::vector<int>v4{
    
     4,5,6 };

	//def value
	cv::Point p1(0, 0);
	cv::Point p2(0, 1);
	cv::Point p3(0, 2);
	cv::Point p4(0, 3);

	std::map<std::vector<int>, cv::Point>data;
	 
	//添加
	//data.insert(std::pair<std::vector<int>, cv::Point>(v1, p1));
	//或者 -->
	data.insert(std::make_pair(v1, p1));
	data.insert(std::make_pair(v2, p2));
	data.insert(std::make_pair(v3, p3));
	data.insert(std::make_pair(v4, p4));

	//traverse
	std::map<std::vector<int>, cv::Point>::iterator iter;
	for (iter = data.begin(); iter != data.end(); iter++)
	{
    
    
		std::cout << "{ ";
		for (int i = 0; i < iter->first.size(); ++i)
		{
    
    
			std::cout << iter->first[i];
			if (i != iter->first.size() - 1)
			{
    
    
				std::cout << ",";
			}
			else {
    
    
				std::cout << "}    , ";
			}
		}
		std::cout << iter->second << std::endl;
	}

输出结果:
在这里插入图片描述

  • 将值改为cv::Rect
//test2
	//define key
	std::vector<int>v1{
    
     1,2,3 };
	std::vector<int>v2{
    
     2,3,4 };
	std::vector<int>v3{
    
     3,4,5 };
	std::vector<int>v4{
    
     4,5,6 };

	//def value
	cv::Rect rect1(1, 1, 2, 2);
	cv::Rect rect2(1, 2, 3, 2);
	cv::Rect rect3(1, 4, 4, 2);
	cv::Rect rect4(4, 1, 5, 2);

	std::map<std::vector<int>, cv::Rect>data;
	data.insert(std::make_pair(v1, rect1));
	data.insert(std::make_pair(v2, rect2));
	data.insert(std::make_pair(v3, rect3));
	data.insert(std::make_pair(v4, rect4));

	//traverse
	std::map<std::vector<int>, cv::Rect>::iterator iter;
	for (iter = data.begin(); iter != data.end(); iter++)
	{
    
    
		std::cout << "{ ";
		for (int i = 0; i < iter->first.size(); ++i)
		{
    
    
			std::cout << iter->first[i];
			if (i != iter->first.size() - 1)
			{
    
    
				std::cout << ",";
			}
			else {
    
    
				std::cout << "}    , ";
			}
		}
		std::cout << iter->second << " : ";
		std::cout << "["<<iter->second.x<<","<<iter->second.y<<","<<iter->second.width<<","<<iter->second.height<<"]"<< std::endl;
	}

在这里插入图片描述

  • 将key 加入cv::Point
cv::Point p1(0, 0);
	cv::Point p2(0, 1);
	cv::Point p3(0, 2);
	cv::Point p4(0, 3);
	cv::Point p5(0, 4);
	cv::Point p6(0, 5);

	//define key
	std::vector<cv::Point>v1{
    
     p1,p2,p3 };
	std::vector<cv::Point>v2{
    
     p2,p3,p4 };
	std::vector<cv::Point>v3{
    
     p3,p4,p5 };
	std::vector<cv::Point>v4{
    
     p4,p5,p6 };

	cv::Rect rect1(1, 1, 2, 2);
	cv::Rect rect2(1, 2, 3, 2);
	cv::Rect rect3(1, 4, 4, 2);
	cv::Rect rect4(4, 1, 5, 2);

	std::map<std::vector<cv::Point>, cv::Rect>data;
	data.insert(std::make_pair(v1, rect1));
	data.insert(std::make_pair(v2, rect2));
	data.insert(std::make_pair(v3, rect3));
	data.insert(std::make_pair(v4, rect4));


	//traverse
	std::map<std::vector<cv::Point>, cv::Rect>::iterator iter;
	for (iter = data.begin(); iter != data.end(); iter++)
	{
    
    
		std::cout << "{ ";
		for (int i = 0; i < iter->first.size(); ++i)
		{
    
    
			std::cout << iter->first[i];
			if (i != iter->first.size() - 1)
			{
    
    
				std::cout << ",";
			}
			else {
    
    
				std::cout << "}    , ";
			}
		}
		std::cout << iter->second << " : ";
		std::cout << "["<<iter->second.x<<","<<iter->second.y<<","<<iter->second.width<<","<<iter->second.height<<"]"<< std::endl;
	}

在这里插入图片描述

  • 改为:
cv::Point p1(0, 0);
	cv::Point p2(0, 1);
	cv::Point p3(0, 2);
	cv::Point p4(0, 3);
	cv::Point p5(0, 4);
	cv::Point p6(0, 5);

	//define key
	std::vector<cv::Point>v1{
    
     p1,p2,p3 };
	std::vector<cv::Point>v2{
    
     p2,p3,p4 };
	std::vector<cv::Point>v3{
    
     p3,p4,p5 };
	std::vector<cv::Point>v4{
    
     p4,p5,p6 };

	cv::Rect rect1(1, 1, 2, 2);
	cv::Rect rect2(1, 2, 3, 2);
	cv::Rect rect3(1, 4, 4, 2);
	cv::Rect rect4(4, 1, 5, 2);

	std::map<std::vector<cv::Point>*,cv::Rect>data;
	data.insert(std::make_pair(&v1, rect1));
	data.insert(std::make_pair(&v2, rect2));
	data.insert(std::make_pair(&v3, rect3));
	data.insert(std::make_pair(&v4, rect4));

	//traverse
	std::map<std::vector<cv::Point>*, cv::Rect>::iterator iter;

	for (iter = data.begin(); iter != data.end(); iter++)
	{
    
    
		std::cout << "{ ";
		for (int i = 0; i < (*iter->first).size(); ++i)
		{
    
    
			std::cout << (*iter->first)[i];
			if (i != (*iter->first).size() - 1)
			{
    
    
				std::cout << ",";
			}
			else {
    
    
				std::cout << "}    , ";
			}
		}
		std::cout << iter->second << " : ";
		std::cout << "[" << iter->second.x << "," << iter->second.y << "," << iter->second.width << "," << iter->second.height << "]" << std::endl;
	}

在这里插入图片描述

参考

1.C++ map用法总结(整理)
2.c++中map详解

猜你喜欢

转载自blog.csdn.net/yohnyang/article/details/130526032