map是一种字典存储<key,value>型数据,map里存放的必须是pair模板类的对象,因为pair模板中的first就是key,second就是value。
pair模板在STL种的定义很复杂,我只了解了如何创建pair对象和提供了哪些接口。
1、创建pair对象
std::pair<K, V> element;
std::pair<K, V> element(x,y);
std::pair<K, V> element(theElement)
语句一调用默认构造函数创建了pair类对象element,没有赋值。语句二调用构造函数创建了element对象并初始化了值。语句三调用复制构造函数。
要想改变pair对象的值可直接对first,second赋值,也可使用pair中的赋值运算符“=”,或swap成员函数。
std::make_pair<K,V>(x,y);
make_pair也可用来创建pair对象。K,V可以缺省,自动根据x,y类型确认K,V。
2,创建容器map
std::map<K,V,std::less<K> > L;
其中K,V指定了键的类型和值的类型,std::less是map默认使用的排序方法(不写第三个参数,就使用std::less)。在stl中是这样定义less的
template<class _Ty = void>
struct less
{ // functor for operator<
typedef _Ty first_argument_type;
typedef _Ty second_argument_type;
typedef bool result_type;
constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
{ // apply operator< to operands
return (_Left < _Right);
}
};
其中重载的()是关键,在stl中元素是按照key从小到大排序的,如果想从大到小排序,就可以仿照less定义myless
template<class _Ty = void>
struct less
{ // functor for operator<
typedef _Ty first_argument_type;
typedef _Ty second_argument_type;
typedef bool result_type;
constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
{ // apply operator< to operands
return (_Left > _Right);
}
};
std::map<K,V,myless<K> > L;
L中元素就是按key从大到下排序了,如果key不是基本类型,key中必须重载<。
3、容器map的相关操作。
1、at和下标运算符 [ ]
与顺序容器不同的是at和 [ ]中放的是键值key,根据key去找元素,而不是根据序号 i。
而且返回值是V型值,不是pair类型。
有人可能会问,如果有key值相同,但value值不同的元素,返回哪一个呢?其实map中不允许有key值相同的pair对象,如果插入一个已经存在的key值,根本插不进去,不会报错,但map不会改变。
2、begin()、end()、rbegin()、rend()
上面说at和[ ]只能根据键值查找,但如果希望获得第…个元素,就需要用到迭代器。
begin()返回第一个元素的迭代器
end() 返回最后一个元素,下一个位置处的迭代器(没有元素)
rbegin() 返回最后一个元素的迭代器(reverse_iterator)不同于iterator,不可作为erase的参数。
rend() 返回第一个元素前面位置的迭代器
3、insert()和 [ ]
insert的参数是pair对象
`s.insert(std::make_pair(1, 100));[ ]也可以用来插入,
element[1]=100
,如果键值1存在,则直接修改value。如果键值不存在,则创建一个pair对象。
4、erase()
当参数是键值,返回值是bool类型,如果键值存在,则删除成果返回1.不存在,则删除失败返回0。
当参数是迭代器时,返回值是下一个位置的迭代器。
erase(begin())是对的
erase(rbegin())是错的
erase(rbegin()->first)是对的
5、find()
参数是键值,返回值是迭代器。find和at适合查找,insert和
[ ]适合插入。
总结:map不存在下标i,只存在迭代器和键值。