目录
一,map介绍
类pair
函数模板make_pair
二,map使用
一,map介绍
- map是关联容器,按照特定的次序存储元素(由键key和值value组合而成的);
- 键key通常用于排序及唯一标识元素,而值value则存储与键key关联的内容;
- 键key和值value的类型可能不同,且在map的内部,key与value通过成员类型value_type绑定在一起;
typedef pair<const Key, T> value_type;
- map中的元素总是按照其内部比较对象(compare)所指示的特定严格弱排序准则进行排序;
- map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代;
- map支持下标访问符,即在[ ]中放key,即可找到与key对应的value;
- map通常被实现为二叉搜索树(更准确的说,平衡二叉搜索树(红黑树));
注:
- map中的元素是键值对;
- map中的key是唯一的,并且不能修改;
- 默认按照小于的方式对key进行比较;
- map中的元素如用迭代器去遍历,可以得到一个有序序列;
- map底层为平衡搜索树(红黑树),查找效率比较高O(logN);
类pair
- 此类将一对值组合在一起,值类型可以不同;
- pair是tuple的特殊形式;
- 可直接访问其公共成员变量first、second;
template <class T1, class T2> struct pair;
函数模板make_pair
- 用传递的元素,构建一个pair对象;
template <class T1, class T2>
pair<V1,V2> make_pair (T1&& x, T2&& y);
二,map使用
- Key,键值对中key的类型;
- T,键值对中value的类型;
- Compare,比较器类型,map中的元素是按照key来比较的,默认按照小于来比较,一般情况下(内置类型)该参数不需传递,如无法比较(自定义类型),需要用户自己显示传递比较规则(一般情况下按照函数指针或仿函数来传递);
- Alloc,通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间适配器;
构造函数
操作函数
//迭代器
iterator begin() noexcept;
const_iterator begin() const noexcept;
iterator end() noexcept;
const_iterator end() const noexcept;
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;
//插入
single element (1)
pair<iterator,bool> insert (const value_type& val);
template <class P> pair<iterator,bool> insert (P&& val);
with hint (2)
iterator insert (const_iterator position, const value_type& val);
template <class P> iterator insert (const_iterator position, P&& val);
range (3)
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
initializer list (4)
void insert (initializer_list<value_type> il);
//删除
iterator erase (const_iterator position);
size_type erase (const key_type& k);
iterator erase (const_iterator first, const_iterator last);
//查找
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;
//访问
mapped_type& operator[] (const key_type& k);
mapped_type& operator[] (key_type&& k);
bool empty() const noexcept;
size_type size() const noexcept;
size_type count (const key_type& k) const;
void swap (map& x);
void clear() noexcept;
key_compare key_comp() const;
value_compare value_comp() const;
iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;
pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
pair<iterator,iterator> equal_range (const key_type& k);
int main()
{
map<string, string> m;
m.insert(pair<string, string>("peach", "桃子")); //pair<string, string> p("peach", "桃子");
m.insert(make_pair("banan", "香蕉"));
m["apple"] = "苹果";
//m.at("waterme"); //不存在抛异常
cout << m.size() << endl;
cout << m.count("waterme") << endl;
pair<map<string, string>::iterator, bool> ret = m.insert(make_pair("banan", "香蕉"));
if (ret.second)
cout << "insert successful" << endl;
else
cout << "insert failed" << endl;
for (auto& e : m)
{
cout << e.first << "-->" << e.second << endl;
}
m.erase("apple");
map<string, string>::iterator it = m.begin();
while (it != m.end())
{
cout << (*it).first << "-->" << (*it).second << endl;
++it;
}
it = m.find("banan");
cout << (*it).first << "-->" << (*it).second << endl;
return 0;
}