1、map基本概念

简介:

map中所有元素都是pair

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

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

本质:

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

优点:

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

map和multimap区别:

map不允许容器中有重复key值元素【可以有重复的value值】

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

2、map构造和赋值

功能描述:

对map容器进行构造和赋值操作

函数原型:

构造:

map mp; //map默认构造函数:

map(const map &mp); //拷贝构造函数

赋值:

map& operator=(const map &mp); //重载等号操作符

#include

#include

using namespace std;

//输出

void printMap01(const map&m)

{

for (map::const_iterator it = m.begin(); it != m.end(); it++)

{

cout <<"key = " <first << " value = " << (*it).second << endl;

}

cout << endl;

}

void test01()

{

//创建map容器

mapm;

//插入数据

//对组 匿名pair

m.insert(pair(1, 10));

m.insert(pair(4, 40));

m.insert(pair(2, 20));

m.insert(pair(3, 30));

printMap01(m);

//拷贝构造

mapm2(m);

printMap01(m2);

//赋值

mapm3;

m3 = m2;

printMap01(m3);

}

int main(int argc, int *argv[])

{

test01();

system("pause");

return 0;

}

总结:map中所有元素都是成对出现,插入数据时候要使用对组

3、map大小和交换

功能描述:

统计map容器大小以及交换map容器

函数原型:

size(); //返回容器中元素的数目

empty(); //判断容器是否为空

swap(st); //交换两个集合容器

#include

#include

using namespace std;

//输出

void printMap02(const map&m)

{

for (map::const_iterator it = m.begin(); it != m.end(); it++)

{

cout << "key = " << it->first << " value = " << (*it).second << endl;

}

cout << endl;

}

//大小操作

void test02()

{

mapm;

m.insert(pair(1, 10));

m.insert(pair(4, 40));

m.insert(pair(2, 20));

m.insert(pair(3, 30));

if (!m.empty())

{

cout << "map不为空,且大小是" << m.size() << endl;

}

else

{

cout << "map为空" << endl;

}

}

//交换

void test002()

{

mapm1;

m1.insert(pair(1, 10));

m1.insert(pair(4, 40));

m1.insert(pair(2, 20));

m1.insert(pair(3, 30));

mapm2;

m2.insert(pair(10, 100));

m2.insert(pair(40, 400));

m2.insert(pair(20, 200));

cout << "交换前:" << endl;

printMap02(m1);

printMap02(m2);

m1.swap(m2); //两个map大小可以不相等

cout << "交换后:" << endl;

printMap02(m1);

printMap02(m2);

}

int main(void)

{

test02();

cout << "----------------------------------------" << endl;

test002();

system("pause");

return 0;

}

总结:

统计大小 --- size

判断是否为空 --- empty

交换容器 --- swap

4、map插入和删除

功能描述:

map容器进行插入数据和删除数据

函数原型:

insert(elem); //在容器中插入元素。

clear(); //清除所有元素

erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。

erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

erase(key); //删除容器中值为key的元素。

#include

#include

using namespace std;

/*

insert(elem); //在容器中插入元素。

clear(); //清除所有元素

erase(pos); /删除pos迭代器所指的元素,返回下一个元素的迭代器。

erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

erase(key); //删除容器中值为key的元素。

*/

//输出

void printMap03(const map&m)

{

for (map::const_iterator it = m.begin(); it != m.end(); it++)

{

cout << "key = " << it->first << " value = " << (*it).second << endl;

}

cout << endl;

}

//插入

void test03()

{

mapm;

//第一种插入

m.insert(pair(1, 10));

//第二种插入【推荐】

m.insert(make_pair(2, 20));

//第三种插入【不推荐】

m.insert(map::value_type(3, 30));

//第四种插入【不推荐】

m[4] = 40;

cout << m[5] << endl; //如果不存在key = 5,则创建一个,且value = 0

//[]可以利用key 访问 value

printMap03(m);

}

//删除

void test003()

{

mapm;

m.insert(pair(1, 10));

m.insert(make_pair(3, 30));

m.insert(make_pair(2, 20));

m.insert(make_pair(4, 40));

printMap03(m); //删除前

m.erase(m.begin());

printMap03(m); //删除后

m.erase(3); //传入key,按key删除

printMap03(m);

//按区间删除

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

//m.clear(); //情空

printMap03(m);

}

int main(int argc, int *argv[])

{

test03();

cout << "----------------------------" << endl;

test003();

system("pause");

return 0;

}

总结:

map插入方式很多,记住其一即可

插入 --- insert

删除 --- erase

清空 --- clear

5、map查找和统计

功能描述:

对map容器进行查找数据以及统计数据

函数原型:

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

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

#include

#include

using namespace std;

/*

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

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

*/

void test04()

{

mapm;

m.insert(make_pair(1, 10));

m.insert(make_pair(3, 30));

m.insert(make_pair(3, 30));

m.insert(make_pair(2, 20));

//查找

map::iterator pos = m.find(3); //通过key查找,返回的是迭代器

if (pos != m.end())

{

cout << "找到了 key = " << pos->first << " value = " << (*pos).second << endl;

}

else

{

cout << "没有找到" << endl;

}

//统计

int count = m.count(3); //map不允许插入相同的key,count结果要么是0,要么是1,multimap的 map可能大于1

cout << "count = " << count << endl;

}

int main(int argc, int* argv[])

{

test04();

system("pause");

return 0;

}

总结:

查找 --- find (返回的是迭代器)

统计 --- count (对于map,结果为0或者1)

6、map容器排序

map容器默认排序规则为 按照key值进行 从小到大排序

利用仿函数,可以改变排序规则

#include

#include

using namespace std;

/*

利用仿函数

*/

class Compare

{

public:

//参数int 和map第一个int类型一样

bool operator()(int v1,int v2)

{

return v1 > v2; //降序

}

};

void test05()

{

mapm;

m.insert(make_pair(1, 10));

m.insert(make_pair(3, 30));

m.insert(make_pair(4, 40));

m.insert(make_pair(2, 20));

m.insert(make_pair(5, 50));

//输出

for (map::iterator it = m.begin(); it != m.end(); it++)

{

cout << "key = " << it->first << " value = " << (*it).second << endl;

}

cout << endl;

}

int main(int argc, int* argv[])

{

test05();

system("pause");

return 0;

}

自定义类型

#include

#include

#include

using namespace std;

class Person

{

public:

Person(string name, int age) :m_Name(name), m_Age(age)

{

}

string m_Name;

int m_Age;

};

//利用仿函数排序

class ComparePerson

{

public:

bool operator()(const Person& p1,const Person& p2)

{

//按年龄降序

return p1.m_Age > p2.m_Age;

}

};

void test06()

{

mapm;

Person p1("刘备", 20);

m.insert(make_pair(p1, 30));

Person p2("关羽", 19);

m.insert(make_pair(p2, 50));

Person p3("张飞", 18);

m.insert(make_pair(p3, 60));

for (map::iterator it = m.begin(); it != m.end(); it++)

{

cout << "key: name = " << it->first.m_Name << " age = " << it->first.m_Age << " value = " << it->second << endl;

}

cout << endl;

}

int main(int argc, int* argv[])

{

test06();

system("pause");

return 0;

}