STL map

STL map 使用详解
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<iterator>
#include<algorithm>
#include<functional>
using namespace std;
//map 底层为红黑树 可以自平衡 即自动排序
//只提供前向迭代器  并且不允许修改键值 也不允许键值重复
//以下 列举常用 的函数
/*
map 构造函数
map(InputIterator first,InputIterator last);//用区间元素 构造map
map(const map<key,T,compare,Alloc>& map1);//拷贝构造
*/
/*
map成员函数
size_typr size();
void swap(const map<key,T,compare,Alloc>& map1);
T& operator[](const key_type& x);
//这个函数很重要  返回pair类型
pair<iterator,bool> insert(const value_type& x);
void insert(iterator first,iterator last)
void erase(iterator pos);
void erase(iterator first,iterator last)
iterator find(const key_type& x);
//重要函数 返回的是该元素插入区间(可能两个迭代器指向同一位置)
//即lower_bound 与upper_bound 的返回值
pair<iterator,iterator> equal_range(const key_type&x)const;

*/
template<class T1, class T2>
struct Print
{
	void operator()(const pair<T1,T2>& Pair)
	{
		cout << Pair.first << "  " << Pair.second << endl;
	}
};

class Own
{
public:
	int beauty;
	int money;
	Own(int b, int m)
	{
		beauty = b;
		money = m;
	}
	//内置类型 的比较函数 在STL中已经存在
	//自定义类型 一定要重载< 或者 > 运算符 否则 无法使用map 
	//1 重载运算符为全局函数(可有元 可非有元)
	//2 重载运算符为成员函数(一定需要后const修饰)
	//3 利用函数对象

	// friend bool operator<(const Own& o1, const Own& o2);
	/*有元形式
	bool operator<(const Own& o)const
	{
		return this->beauty+this->money<o.beauty + o.money;
	}
	*/
};
/*全局形式
bool operator<(const Own& o1, const Own& o2)
{
	return o1.beauty + o1.money < o2.beauty + o2.money;
}
*/

//函数对象
struct Compare
{
	//最好使用后const修饰
	bool operator()(const Own& o1, const Own& o2)const
	{
		return o1.beauty + o1.money < o2.beauty + o2.money;
	}
};

const int len = 6;
int main(void)
{
	//vector<int> ivec(istream_iterator<int>(cin),istream_iterator<int>());
	map<int, string> Map1;
	int array[len] = {5,9,2,4,6,9};
	vector<string> Vec;
	Vec.push_back("zhang");
	Vec.push_back("li");
	Vec.push_back("lu");
	Vec.push_back("zhao");
	Vec.push_back("zhou");
	Vec.push_back("cheng");

	pair<int, string> PairArra[6];
	for (int i = 0; i < len; ++i)
	{
		PairArra[i].first = array[i];
		PairArra[i].second = Vec[i];
	}
	Map1 = map<int, string>(PairArra, PairArra +len);
	typedef map<int, string>::iterator M_ITE;
	pair<M_ITE, bool> bInsert;
	bInsert=Map1.insert(pair<int,string>(1,"mi"));
	if (bInsert.second)
	{
		cout << "insert succes:  " << bInsert.second << endl;
	}
	//for_each(Map1.begin(), Map1.end(), Print<int, string>());
	pair<M_ITE, M_ITE> Range;
	Range = Map1.equal_range(3);
	for_each(Map1.begin(), Map1.end(), Print<int, string>());
	if(Map1.end()!=Range.first)
	cout <<"first  "<< Range.first->first 
		<< "second "<<Range.second->first << endl;
	M_ITE ite = Map1.find(9);
	//使用自带的find函数 比STL算法find快 
	if (Map1.end() != ite)
	{
		cout << ite->first << endl;
	}

	map<Own, string, Compare> Map2;
	Map2.insert(pair<Own,string>(Own(100,100),"mrzhang"));
	//当map的key为自定义类型 时 一定要重载< 运算符 
	//建议写成有元 或者全局形式
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值