# Map的插入操作和按照value排序

1800人阅读 评论(0)

## 说明

[]操作符进行插入。

### []操作符

std::map<int,string> map1;
map1[2]="Hello";

### insert操作

insert的时候会检查是否key冲突，不冲突才进行insert操作，否则该insert操作会被忽略。可以用pair来验证是否插入成功。通过pair的第二个变量来知道是否插入成功，它的第一个变量返回的是一个map的迭代器，如果插入成功的话Insert_Pair.second应该是true的，否则为false。

#### 插入value_type数据

std::map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, “student_one”));
mapStudent.insert(map<int, string>::value_type (2, “student_two”));

std::pair<std::map<int,string>::iterator,bool> ret;
ret = mapStudent.insert ( std::pair<int,string>(2,"X man") );
if (ret.second==false) {
std::cout << "element '2' already existed";
std::cout << " with a value of " << ret.first->second << '\n';
}

#### 插入pair数据

std::map<int,string> mapStudent;
std::map<int,string>::iterator it =mapStudent.begin();
mapStudent.insert (it, std::pair<int,string>(2,"student_2"));  // max efficiency inserting
mapStudent.insert (it, std::pair<int,string>(3,"student_3"));  // no max efficiency inserting

#### 范围插入

// third insert function version (range insertion):
std::map<int,string> anothermap;
anothermap.insert(mapStudent.begin(),mapStudent.find(2));

    // first insert function version (single parameter):
std::map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, "student_1"));
mapStudent.insert(map<int, string>::value_type (7, "student_7"));

std::pair<std::map<int,string>::iterator,bool> ret;
ret = mapStudent.insert ( std::pair<int,string>(7,"X man") );
if (ret.second==false) {
std::cout << "element '2' already existed";
std::cout << " with a value of " << ret.first->second << '\n';
}

// second insert function version (with hint position):
std::map<int,string>::iterator it = mapStudent.begin();
mapStudent.insert (it, std::pair<int,string>(2,"student_2"));  // max efficiency inserting
mapStudent.insert (it, std::pair<int,string>(3,"student_3"));  // no max efficiency inserting

// third insert function version (range insertion):
std::map<int,string> anothermap;
anothermap.insert(mapStudent.begin(),mapStudent.find(3));

// showing contents:
std::cout << "mapStudent contains:\n";
for (it=mapStudent.begin(); it!=mapStudent.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';

std::cout << "anothermap contains:\n";
for (it=anothermap.begin(); it!=anothermap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';

## map排序

map内部是根据键进行排序的，如果想要修改其排序对象呢，按照value进行排序呢？

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );

template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); 

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef pair<string, int> PAIR;
//实现对pair按value进行比较方法1：比较函数函数的方式
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {
return lhs.second < rhs.second;
}
//实现对pair按value进行比较方法2：函数对象的方式
struct CmpByValue {
bool operator()(const PAIR& lhs, const PAIR& rhs) {
return lhs.second < rhs.second;
}
};
int main()
{
map<string, int> name_score_map;
name_score_map["LiMin"] = 90;
name_score_map["ZiLinMi"] = 79;
name_score_map["BoB"] = 92;
name_score_map.insert(make_pair("Bing",99));
name_score_map.insert(make_pair("Albert",86));
//把map中元素转存到vector中
vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());
// sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue());//指定函数对象的方式，注意这里CmpByValue(),有个括号！
sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value); //指定比较函数的方式
for (int i = 0; i != name_score_vec.size(); ++i)
{
cout << name_score_vec[i].first<<"\t"<< name_score_vec[i].second<< endl;
}
return 0;
}


## map中根据value值的查找

map中，默认的排序是按照key值排的，map自带的find方法也是按着key值查找的。如果想要实现在map中按照value值的查找需要做

### find_if的原型：

template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred)
{
while (first != last && !pred(*first)) ++first;
return first;
} 

find_if是一个模板函数，接受两个数据类型：InputItearator迭代器，Predicate用于比较数值的函数或者函数对象（仿函数）。find_if对迭代器要求很低，只需要它支持自增操作即可。当前遍历到的记录符合条件与否，判断标准就是使得pred()为真。注意观察第三个参数pred。

#include <string>
#include <algorithm>
class map_value_finder
{
public:
map_value_finder(const std::string &cmp_string):m_s_cmp_string(cmp_string){}
bool operator ()(const std::map<int, std::string>::value_type &pair)
{
return pair.second == m_s_cmp_string;
}
private:
const std::string &m_s_cmp_string;
};

int main()
{
std::map<int, std::string> my_map;
my_map.insert(std::make_pair(10, "china"));
my_map.insert(std::make_pair(20, "english"));
my_map.insert(std::make_pair(30, "english"));
my_map.insert(std::make_pair(40, "hongkong"));

std::map<int, std::string>::iterator it = my_map.end();
it = std::find_if(my_map.begin(), my_map.end(), map_value_finder("English"));
if (it == my_map.end())
else
printf("found key:%d value:%s\n", it->first, it->second.c_str());

return 0;
}

class map_finder即用于比较的函数对象，它的核心就是重载的()运算符。因为每个容器迭代器的*运算符得到的结果都是该容器的value_type值，所以该运算符的形参就是map迭代器指向的value_type类型的引用。

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：343851次
• 积分：5509
• 等级：
• 排名：第4816名
• 原创：245篇
• 转载：15篇
• 译文：0篇
• 评论：49条
评论排行
最新评论