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;
}