黑马:map容器(231~235)

黑马:map容器(231~235),第1张

黑马:map容器(231~235)

1.基本概念

简介:

        map中所有元素都是pair

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

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

本质:

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

优点:

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

map和multimap区别:

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

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

2. map构造和赋值

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include

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

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

	printMap(m);

	//拷贝构造
	mapm2(m);
	printMap(m2);

	//赋值
	mapm3;
	m3 = m2;
	printMap(m3);


}

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

	test01();


	system("pause");
	return  0;
}




3. map大小和交换

#include
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include

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

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

	if (m.empty()) {
		cout << "m为空" << endl;
	}
	else {
		cout << "m不为空" << endl;
		cout << "m的大小为 " <m;
	m.insert(pair(4, 10));
	m.insert(pair(2, 50));
	m.insert(pair(3, 30));
	m.insert(pair(1, 40));


	mapm2;
	m2.insert(pair(40, 100));
	m2.insert(pair(20, 500));
	m2.insert(pair(30, 300));
	m2.insert(pair(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
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include

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

//插入
void test01() {
	mapm;

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

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

	//第三种
	m.insert(map::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
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include

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


void test01() {
	mapm;

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

	map::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 mu;
	mu.insert(pair(5, 20));
	mu.insert(pair(4, 10));
	mu.insert(pair(4, 10));
	mu.insert(pair(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
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include


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

};


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


void test01() {
	mapm;

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

	cout << "改变为降序排列" << endl;
	mapm2;
	m2.insert(pair(4, 10));
	m2.insert(pair(2, 50));
	m2.insert(pair(1, 20));
	m2.insert(pair(3, 60));
	
	for (map::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
using namespace std;
#include
#include
#include
#include
#include
#include  //标准算法头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include



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

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

	for (map::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对照加强理解

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4677599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存