# 后台开发：核心技术与应用实践3.4.2　map的查增删

+关注继续查看

3.4.2　map的查增删

1.?map的插入

【例3.18】　用insert函数插入pair数据。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main()

{

map<int, string> mapStudent;

mapStudent.insert(pair<int, string>(1, "student_one"));

mapStudent.insert(pair<int, string>(2, "student_two"));

mapStudent.insert(pair<int, string>(3, "student_three"));

map<int, string>::iterator iter;

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

1 student_one

2 student_two

3 student_three

【例3.19】　用insert函数插入value_type数据。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main()

{

map<int, string> mapStudent;

mapStudent.insert(map<int, string>::value_type (1,"student_one"));

mapStudent.insert(map<int, string>::value_type (2,"student_two"));

mapStudent.insert(map<int, string>::value_type (3,"student_three"));

map<int, string>::iterator  iter;

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

1 student_one

2 student_two

3 student_three

【例3.20】　map中用数组方式插入数据。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main(){

map<int, string> mapStudent;

mapStudent[1] = "student_one";

mapStudent[2] = "student_two";

mapStudent[3] = "student_three";

map<int, string>::iterator iter;

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

1  student_one

2  student_two

3  student_three

mapStudent.insert(map<int, string>::value_type (1, "student_one"));

mapStudent.insert(map<int, string>::value_type (1, "student_two"));

pair<map<int, string>::iterator, bool> insert_pair;

insert_pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));

【例3.21】　用pair判断insert到map的数据是否插入成功。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main(){

map<int, string> mapStudent;

pair<map<int, string>::iterator, bool> insert_pair;

insert_pair = mapStudent.insert(pair<int,string>(1,"student_one"));

if(insert_pair.second == true){

cout<<"Insert Successfully"<<endl;

}

else{

cout<<"Insert Failure"<<endl;

}

insert_pair = mapStudent.insert(pair<int, string>(1, "student_two"));

if(insert_pair.second == true){

cout<<"Insert Successfully"<<endl;

}else{

cout<<"Insert Failure"<<endl;

}

map<int, string>::iterator iter;

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

Insert Successfully

Insert Failure

1 student_one

【例3.22】　数据方式插入map覆盖原有的数据。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main()

{

map<int,string> mapStudent;

mapStudent[1] =  "student_one";

mapStudent[1] =  "student_two";

mapStudent[2] =  "student_three";

map<int, string>::iterator iter;

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

1 student_two

2 student_three

mapStudent[1] =  "student_two";

2.?map的遍历

map数据的遍历，这里也提供3种方法，来对map进行遍历：应用前向迭代器方式、应用反向迭代器方式和数组方式。应用前向迭代器，上面举例程序中已经讲解过了，这里着重讲解应用反向迭代器的方式，下面举例说明。

【例3.23】　map反向迭代器的使用举例。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main(){

map<int,string> mapStudent;

mapStudent[1] =  "student_one";

mapStudent[2] =  "student_two";

mapStudent[3] =  "student_three";

map<int, string>::reverse_iterator   iter;

for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

3 student_three

2 student_two

1 student_one

【例3.24】　用数组方式遍历map。

#include<map>

#include<string>

#include<iostream>

using namespace std;

int main(){

map<int,string> mapStudent;

mapStudent[1] =  "student_one";

mapStudent[2] =  "student_two";

mapStudent[3] =  "student_three";

int iSize = mapStudent.size();

for(int i = 1; i <= iSize; i++){

cout<<i<<" "<<mapStudent[i]<<endl;

}

return 0;

}

3.?map的查找

【例3.25】　用f?ind方法查找map中的数据。

#include<map>

#include<string>

#include<iostream>

using namespace std;

int main(){

map<int,string> mapStudent;

mapStudent[1] = "student_one";

mapStudent[2] = "student_two";

mapStudent[3] = "student_three";

map<int, string>::iterator iter=mapStudent.find(1);

if(iter != mapStudent.end()){

cout<<"Found, the value is "<<iter->second<<endl;

}else{

}

return 0;

}

Find, the value is student_one

f?ind函数返回的是一个迭代器；找不到对应数据的时候，则会返回mapStudent.end()。

4.?map的删除

map.erase(k)

map.erase(p)

map.erase(b,e)

【例3.26】　用erase方法删除map中的元素。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main(){

map<int, string> mapStudent;

mapStudent[1]="student_one";

mapStudent[2]="student_two";

mapStudent[3]="student_three";

mapStudent[4]="student_four";

map<int, string>::iterator iter=mapStudent.begin();

for(;iter!=mapStudent.end();){

if((*iter).second=="student_one"){

mapStudent.erase(iter++);

}

else{

++iter;

}

}

for(iter=mapStudent.begin();iter!=mapStudent.end();iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

2 student_two

3 student_three

4 student_four

mapStudent.erase(iter++);中的iter++，不是erase(iter)，然后iter++。因为iter指针被erase之后就失效了，不能再用iter++；也不是erase(++iter)，这样就不是删iter原来指向的元素了。

5.?map的排序

map的排序默认按照key从小到大排序，但有以下几点需要注意：①按照key从大到小排序；②key（第一个元素）是一个结构体；③想按value（第二个元素）排序。

map是STL里面的一个模板类，现在来看下map的定义：

template < class Key, class T, class Compare = less<Key>,

class Allocator = allocator<pair<const Key,T> > > class map;

class Compare = less<Key>

template <class T> struct less : binary_function <T,T,bool> {

bool operator() (const T& x, const T& y) const

{return x<y;}

};

template <class T> struct greater : binary_function <T,T,bool> {

bool operator() (const T& x, const T& y) const

{return x>y;}

};

【例3.27】　让map中的元素按照key从大到小排序。

#include <map>

#include <string>

#include <iostream>

using namespace std;

int main(){

map<string, int, greater<string> > mapStudent;

mapStudent["LiMin"]=90;

mapStudent["ZiLinMi"]=72;

mapStudent["BoB"]=79;

map<string, int>::iterator iter=mapStudent.begin();

for(iter=mapStudent.begin();iter!=mapStudent.end();iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

ZiLinMi 72

LiMin 90

BoB 79

struct CmpByKeyLength {

bool operator()(const string& k1, const string& k2) {

return k1.length() < k2.length();

}

};

【例3.28】　重定义map内部的Compare函数。

#include <map>

#include <string>

#include <iostream>

using namespace std;

struct CmpByKeyLength {

bool operator()(const string& k1, const string& k2) {

return k1.length() < k2.length();

}

};

int main(){

map<string, int, CmpByKeyLength > mapStudent;

mapStudent["LiMin"]=90;

mapStudent["ZiLinMi"]=72;

mapStudent["BoB"]=79;

map<string, int>::iterator iter=mapStudent.begin();

for(iter=mapStudent.begin();iter!=mapStudent.end();iter++){

cout<<iter->first<<" "<<iter->second<<endl;

}

return 0;

}

BoB 79

LiMin 90

ZiLinMi 72

key是结构体的，如果没有重载小于号（<）操作，就会导致insert函数在编译时就无法编译成功。其实，为了实现快速查找，map内部本身就是按序存储的（比如红黑树）。在插入<key, value>键值对时，就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行<运算比较的原因。

【例3.29】　key是结构体的map排序。

#include <map>

#include <string>

#include <iostream>

using namespace std;

typedef struct tagStudentInfo

{

int iID;

string  strName;

bool operator < (tagStudentInfo const& r) const {

// 这个函数指定排序策略，按iID排序，如果iID相等的话，按strName排序

if(iID < r.iID)  return true;

if(iID == r.iID) return strName.compare(r.strName) < 0;

return false;

}

}StudentInfo;// 学生信息

int main(){

/*用学生信息映射分数*/

map<StudentInfo, int>mapStudent;

StudentInfo studentInfo;

studentInfo.iID = 1;

studentInfo.strName = "student_one";

mapStudent[studentInfo]=90;

studentInfo.iID = 2;

studentInfo.strName = "student_two";

mapStudent[studentInfo]=80;

map<StudentInfo, int>::iterator iter=mapStudent.begin();

for(;iter!=mapStudent.end();iter++){

cout<<iter->first.iID<<" "<<iter->first.strName<<" "<<iter->second<<endl;

}

return 0;

}

1 student_one 90

2 student_two 80

template <class T1, class T2> struct pair

{

typedef T1 first_type;

typedef T2 second_type;

T1 first;

T2 second;

pair() : first(T1()), second(T2()) {}

pair(const T1& x, const T2& y) : first(x), second(y) {}

template <class U, class V>

pair (const pair<U,V> &p) : first(p.first), second(p.second) { }

}

pair也是一个模板类，这样就实现了良好的通用性。它仅有两个数据成员f?irst和second，即key和value，而且在<utility>头文件中，还为pair重载了< 运算符，具体实现如下所示：

template<class _T1, class _T2>

inline bool

operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)

{ return __x.first < __y.first

|| (!(__y.first < __x.first) && __x.second < __y.second); }

__x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second)

!(__y.first < __x.first) && __x.second < __y.second

!(__y.f?irst < __x.f?irst)表示y的key不小于x的key，结合前提条件，__x.f?irst < __y.f?irst不成立，即x的key不小于y的key。

<符。

typedef pair<string, int> PAIR;

bool operator< (const PAIR& lhs, const PAIR& rhs) {

return lhs.second < rhs.second;

}

typedef pair<string, int> PAIR;

bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {

return lhs.second < rhs.second;

}

struct CmpByValue {

bool operator()(const PAIR& lhs, const PAIR& rhs) {

return lhs.second < rhs.second;

}

};

template <class RandomAccessIterator>

void sort ( RandomAccessIterator first, RandomAccessIterator last );

template <class RandomAccessIterator, class Compare>

void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

【例3.30】　将map按value排序。

#include <map>

#include <vector>

#include <string>

#include <iostream>

using namespace std;

typedef pair<string, int> PAIR;

bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {

return lhs.second < rhs.second;

}

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());

/*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<<" "<<name_score_vec[i].second<<endl;

}

return 0;

}

《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约

1568 0
《Kinect应用开发实战：用最自然的方式与机器对话》一2.3　Kinect相关技术规格

1790 0
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之83——BREW后台应用

498 0
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之67---BREW 应用中的SVG技术

587 0
《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP
Solidity编程语言解决了编写智能合约的不友好的问题，但是当合约编译并部署之后，对与这些接口的访问，对于一般的使用者来说，门槛有点高， 对普通用户来说也是非常不友好，为了使广大用户理解并方便快捷的访问区块链，以及区块链上的智能合约系统，开发者必须提供操作界面和结果查看界面，来简化用户访问和操作区块链的方式。
4115 0

区块链的采用在地方层面上相当缓慢。但是，新加坡，菲律宾和瑞士等国家已逐步采取支持区块链技术和数字货币的政策。爱沙尼亚在启动电子驻留计划后也引起了一些关注，该计划允许公民在区块链上登记他们的数据。 　　当然，大规模采用也涉及意识。
1696 0

768 0
+关注
10059

0

+ 订阅

JS零基础入门教程（上册）