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