我是靠谱客的博主 和谐诺言,最近开发中收集的这篇文章主要介绍黑马:map容器(231~235),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.基本概念

简介:

        map中所有元素都是pair

        pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)

        所有元素都会根据元素的键值自动排序

本质:

        map/multimap属于关联式容器,底层结构使用二叉树实现

优点:

         可以根据key值快速找到value值

map和multimap区别

        map不允许容器中有重复key值元素

        multimap允许容器中有重复key值元素

2. map构造和赋值

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>

void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value =  " << it->second << endl;
	}
	cout << endl;
}

void test01() {
	map<int, int>m;
	m.insert(pair<int, int>(4, 10));
	m.insert(pair<int, int>(2, 50));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(1, 40));  //根据key来排序

	printMap(m);

	//拷贝构造
	map<int, int>m2(m);
	printMap(m2);

	//赋值
	map<int, int>m3;
	m3 = m2;
	printMap(m3);


}

int main(int argc,char**argv) {  

	test01();


	system("pause");
	return  0;
}




3. map大小和交换

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>

void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value =  " << it->second << endl;  //星号或者箭头自己选择即可
	}
	cout << endl;
}

//大小
void test01() {
	map<int, int>m;
	m.insert(pair<int, int>(4, 10));
	m.insert(pair<int, int>(2, 50));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(1, 40));  //根据key来排序

	if (m.empty()) {
		cout << "m为空" << endl;
	}
	else {
		cout << "m不为空" << endl;
		cout << "m的大小为 " <<m.size()<< endl;
	}

}


//交换
void test02() {
	map<int, int>m;
	m.insert(pair<int, int>(4, 10));
	m.insert(pair<int, int>(2, 50));
	m.insert(pair<int, int>(3, 30));
	m.insert(pair<int, int>(1, 40));


	map<int, int>m2;
	m2.insert(pair<int, int>(40, 100));
	m2.insert(pair<int, int>(20, 500));
	m2.insert(pair<int, int>(30, 300));
	m2.insert(pair<int, int>(10, 400));

	cout << "交换前 " << endl;
	printMap(m);
	printMap(m2);

	cout << "交换后 " << endl;
	m.swap(m2);
	printMap(m);
	printMap(m2);

}
int main(int argc,char**argv) {  

	//test01();
	test02();

	system("pause");
	return  0;
}




4. map插入和删除

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>

void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value =  " << it->second << endl;  //星号或者箭头自己选择即可
	}
	cout << endl;
}

//插入
void test01() {
	map<int, int>m;

	//第一种
	m.insert(pair<int, int>(4, 10));

	//第二种
	m.insert(make_pair(2, 20));

	//第三种
	m.insert(map<int, int>::value_type(3, 50));

	//第四种
	m[4] = 40;  //把10改成40了

	//不建议用第四种插入,[]的方式应该是通过key访问到value
	//如果按照下面这种形式插入,因为没有5的值,会制造一个(5,0)的键值对并且会在输出结果第一行返回个0
	//cout << m[5] << endl;

	printMap(m);

	//删除
	m.erase(m.begin());
	printMap(m);

	m.erase(3); //按照key删除
	printMap(m);

	//清空
	m.erase(m.begin(), m.end()); 
	m.clear();
	printMap(m);

}


int main(int argc,char**argv) {  

	test01();
	

	system("pause");
	return  0;
}




5. map查找和统计

find(key)      查找key是否存在,存在返回该键的元素的迭代器,不存在,返回set.end();

count(key)   统计key的元素个数

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>

void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value =  " << it->second << endl;  //星号或者箭头自己选择即可
	}
	cout << endl;
}


void test01() {
	map<int, int>m;

	
	m.insert(pair<int, int>(4, 10));
	m.insert(pair<int, int>(2, 50));
	m.insert(pair<int, int>(1, 20));
	m.insert(pair<int, int>(3, 60));

	map<int, int>::iterator pos = m.find(4);
	if (pos != m.end()) {
		cout << "查找到了元素key = " << (*pos).first << " value = " << pos->second << endl;
	}
	else {
		cout << "未找到元素" << endl;
	}

	//统计
	int num = m.count(3);
	cout << "num = " << num << endl;   //对于map而言,不允许插入重复元素, count要么是0要么是1



	multimap<int, int> mu;
	mu.insert(pair<int, int>(5, 20));
	mu.insert(pair<int, int>(4, 10));
	mu.insert(pair<int, int>(4, 10));
	mu.insert(pair<int, int>(4, 10));

	int num1 = mu.count(4);
	cout << "num1 = " << num1 << endl; //multimap 可以 输出为3



}


int main(int argc,char**argv) {  

	test01();
	

	system("pause");
	return  0;
}




6. map容器排序

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>


class myCompare {
public:
	bool operator()(int v1, int v2)const {  //别忘了加const!!
		return v1 > v2;
	}

};


void printMap(map<int, int>& m) {
	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "key = " << (*it).first << " value =  " << it->second << endl;  //星号或者箭头自己选择即可
	}
	cout << endl;
}


void test01() {
	map<int, int>m;

	cout << "正常为升序排列" << endl;
	m.insert(pair<int, int>(4, 10));
	m.insert(pair<int, int>(2, 50));
	m.insert(pair<int, int>(1, 20));
	m.insert(pair<int, int>(3, 60));
	printMap(m);

	cout << "改变为降序排列" << endl;
	map<int, int, myCompare>m2;
	m2.insert(pair<int, int>(4, 10));
	m2.insert(pair<int, int>(2, 50));
	m2.insert(pair<int, int>(1, 20));
	m2.insert(pair<int, int>(3, 60));
	
	for (map<int, int, myCompare>::iterator it = m2.begin(); it != m2.end(); it++) {
		cout << "key = " << it->first << " value = " << it->second << endl;
	}

	cout << endl;

}


int main(int argc,char**argv) {  

	test01();
	

	system("pause");
	return  0;
}




7. map存放自定义数据类型(自己拓展写的)

#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<iterator>
#include<list>
#include<algorithm>  //标准算法头文件
#include<numeric>
#include<map>
#include<set>
#include<utility>
#include<fstream>
#include<string>
#include<ctime>
#include<stack>
#include<queue>



class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

class myCompare {
public:
	bool operator()(const Person& p1, const Person& p2)const {
		return p1.m_Age > p2.m_Age;
	}
};


void test01() {
	map<Person, int, myCompare> m;

	m.insert(pair<Person, int>(Person("刘备", 29), 29));
	m.insert(pair<Person, int>(Person("关羽", 39), 39));
	m.insert(pair<Person, int>(Person("张飞", 50), 50));
	m.insert(pair<Person, int>(Person("赵云", 19), 19));

	for (map<Person, int, myCompare>::iterator it = m.begin(); it != m.end(); it++) {
		cout << "姓名为: " << it->first.m_Name << " 年龄为: " << it->second << endl;
	}

}

int main(int argc, char** argv) {

	test01();


	system("pause");
	return  0;
}








可以跟set对照加强理解

最后

以上就是和谐诺言为你收集整理的黑马:map容器(231~235)的全部内容,希望文章能够帮你解决黑马:map容器(231~235)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部