C++STL笔记十:map/multimap容器;

Key_Value结构的字典终于登场了。

map/multimap简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

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

优点:

  • 可以根据key键值快速找到对应的value值。

map和multimap区别:

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

构造和赋值

函数原型:

构造:

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

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

赋值:

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

void test01()
{
	// 创建map容器
	map m;
	// map中所有元素都是成对出现的,插入数据时候要使用对组。map会自动根据key值排序。
	m.insert(pair(3, 10));   // 里面其实是一个匿名对组。
	m.insert(pair(2, 30)); 
	m.insert(pair(4, 40));   
	m.insert(pair(1, 60));
	printMap(m);
	// 拷贝构造:
	map m2(m);   // 拷贝构造。
	map m3(m);   // 拷贝构造。

	m2 = m3;   // 赋值。
}

打印输出:

void printMap(const map& m)
{
	for (map::const_iterator it= m.begin(); it !=m.end(); it++)
	{
		cout << "Key = " << (*it).first << ",Value = " << (*it).second << endl;
	}
}

总结:

  • map中所有元素都是成对出现的,插入输入时要使用对组pair。


map容器和大小

函数原型:

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

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

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



map插入和删除元素

函数原型:

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

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

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

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

  • erase(key); //删除容器中值为key的元素。按照key来删除数据。

void test02()
{
	mapm;
	// 插入
	// 第一种:
	m.insert(pair(1, 10)));  // 匿名对组。

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

	// 第三种:
	m.insert(map::value_type(3, 30));

	// 第四种:默认有一个重载的[]
	m[4] = 40;

	// []不建议使用,用途,可以利用key访问到value
	cout << m[4] << endl;   // 如果在map中没有m标记的索引为4的元素,则会将m[4] = 0;所以一般不会用第四种插入方式。

	// 删除:
	m.erase(3);  // 删除key为3的值。

	m.erase(m.begin());
	m.erase(m.begin(), m.end());
	m.clear();
}


map查找和统计

函数原型:

  • find(key);       // 查找key是否存在,
    • 若存在,则返回该键的元素的迭代器;
    • 如果不存在,返回set.end();
  • count(key);    // 统计key的元素个数。
map::iterator pos = m.find(3);
if (pos != m.end())
{
	cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
}
else
{
	cout << "未找到元素" << endl;
}


map容器排序

利用仿函数,可以改变容器的排序规则。

仿函数:就是重载了函数调用运算符()仿函数本质上是一个类型。

构造两个类型:

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

	string m_Name;
	int m_Age;
};

enum Level
{
	 A,
	 B,
	 C
};

仿函数:规定排序规则。

class MyCompare
{
public:
	bool operator()(Person p1, Person p2)const
	{
		return p1.m_Age < p2.m_Age;
	}
};
void test01()
{
	map  m;
	
	Person p1("张三", 18);
	Person p2("李四", 20);
	Person p3("王五", 19);
	
	m.insert(pair(p1, A));
	m.insert(pair(p2, B));
	m.insert(pair(p3, C));

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

你可能感兴趣的:(C++,c++,map容器,键值对,Key_Value)