标准C++中map容器的用法总结

时间:2021-05-17 14:09:26

一、简单介绍

map 是一个容器,它用于储存数据并且能从一个数据集合中取出数据。它的数据组成包含两项,一个是它的数据值,一个是用于排序的关键字。其中关键字是惟一的,它用于将数据自动排序。而每个元素的数据值与关键字无关,可以直接改变。

需加载的头文件:

#include<map>

using namespace std;

模板原型:

template <class Key,class Type,class Traits = less<Key>,class Allocator=allocator<pair <const Key,Type>>>

(1)Key:存储在 map 容器中的关键字的数据类型

(2)Type:储存在 map 容器中的数据值的数据类型

(3)Traits:它是一个能提供比较两个元素的关键字来决定它们在map容器中的相对位置。它是可选的,它的默认值是 less<key>

(4)Allocator:它代表存储管理设备。它是可选的,它的默认值为allocator<pair <const Key, Type> >

map 容器有以下的特点:

(1)它是一个相关联的容器,它的大小可以改变,它能根据关键字来提高读取数据能力。

(2)它提供一个双向的定位器来读写取数据。

(3)它已经根据关键字和一个比较函数来排好序。

(4)它的每一个元素的关键字都是惟一的。

(5)它是一个模板,它能提供一个一般且独立的数据类型。

二、成员函数

1、begin()

功能:返回第一个元素的定位器(iterator)的地址。

语法:const_iterator begin() const;

            iterator begin();

说明:当返回的第一个元素的地址值为一个常值定位器(_iterator),则 map 不会被修改。当返回的第一个元素的地址值为一个定位器(iterator),则 map 可被修改。

函数返回值:返回一个指向第一个元素的双向定位器地址。

2、clear()

功能:将一个 map 容器的全部元素删除。

语法:void clear();
说明:clear 会删除 map 容器的全部元素。

3、count()

功能:返回对应某个关键字的元素的个数。

语法:size_type count(const Key& _Key) const;

说明:_Key 是要进行匹配的关键字的值。该函数的返回值的范围是[low_bound(_Key),upper_bound(_Key)]。因为 map 容器的关键字是惟一的,故它只能取 0 或者 1。

函数返回值:当 map 容器包含了关键字为_Key 的这个元素时,返回 1,否则返回 0。

4、empty()

功能:测试一个 map 容器是否为空。

语法:bool empty() const;

说明:empty 函数用于测试一个 map 容器是否为空。

函数返回值:当容器 map 为空时,返回 true,否则返回 false。

5、end()

功能:返回最后一个元素后面的定位器(iterator)的地址。

语法:const_iterator end() const;
            iterator end();

说明:end 函数用于测试一个定位器是否已达到它的尾部。

函数返回值:返回一个指向最后一个元素后面的双向定位器地址。当 map 容器为空时,结果没定义。

6、equal_range()

功能:返回一对定位器,它们分别指向第一个大于或等于给定的关键字的元素和第一个比给定的关键字大的元素。

语法:pair <const_iterator, const_iterator> equal_range (const Key& _Key) const;

            pair <iterator, iterator> equal_range (const Key& _Key) const;

说明:_Key 是一个用于排序的关键字。

函数返回值:返回一对定位器。要从第一个定位器中取得数据,可用 pr.first。从第二个定位器中取得数据,则用 pr.second。

7、erase()

功能:将一个或一定范围的元素删除。

语法:iterator erase(iterator _Where);

            iterator erase(iterator _First,iterator _Last);

            size_type erase(const key_type& _Key);

说明:_Where表示要删除的元素的位置;_First表示第一个被删除的元素的位置;_Last表示第一个不被删除的元素的位置;_Key表示从 map 容器中删除的元素的关键字的值。

因为没有重新分配空间,故只有对应于被删除元素的 iterator 和 reference 失效。需要注意的是它不会抛出任何的 exception。

函数返回值:前两个函数返回一个指向第一个没被删除的元素的双向定位器,如果不存在这样的元素,则返回 map 容器的末尾。第三个函数返回被删除的元素的个数。

8、find()

功能:求出与给定的关键字相等的元素的定位器。

语法:iterator find(const Key& _Key);

            const_iterator find(const Key& _Key) const;

说明:_Key 是要进行搜索的关键字的值。该函数会返回一个指向关键字为_Key 的元素的定位器。当返回的第一个元素的地址值为一个常值定位器(_iterator),则 map 可通过它

不会被修改。当返回的第一个元素的地址值为一个定位器(iterator),则 map 可通过它被修改。

函数返回值:找到该元素时,返回一个指向关键字为_Key 的元素的定位器,否则返回一个指向 map 容器的结束的定位器。

9、get_allocator()

功能:返回一个构造该 map 容器的 allocator 的一个副本。

语法:Allocator get_allocator() const;

说明:容器 map 的 allocator 指明一个类的存储管理。默认的 allocator 能提供 STL 容器高效的运行。

函数返回值:该容器的 allocator

10、insert()

功能:将一个元素或者一定数量的元素插入到 map 的特定位置中去。

语法:pair <iterator, bool> insert(const value_type& _Val);

            iterator insert(iterator _Where,const value_type& _Val);

            template<class InputIterator> void insert(InputIterator _First,InputIterator _Last);

说明:_Where表示第一个被插入到 map 的元素的位置;_Val表示插入的参数的值;_First表示第一个被插入的位置;_Last表示第一个不被插入的位置。

如果能在_Where 后面迅速地插入,那么只要很短的时间。

第三个成员函数将范围为[ _First,_Last ]中的元素插入。

函数返回值:第一个函数返回一对值,当插入成功时,bool=true,当要插入的元素的关键字与已有的参数的值相同,则 bool=false,而 iterator 指向插入的位置或者已存在的元素的位置。第二个函数返回指向插入位置的定位器。

代码示例如下:

map<string, int> mymap;
string str;
pair<map<string, int>::iterator, bool> inspos;

//insert函数返回一个pair对象,该对象包含一个迭代器和一个bool值
//如果bool为true则说明正确插入,否则说明插入的值含有重复的键值,此时不做任何操作
//返回的迭代器都为指定元素
inspos = mymap.insert(map<string, int>::value_type(str, 1));

if (pairIns.second == false)
{
((*(pairIns.first)).first).append("OK");
}

//另外一种insert方法,这种方法不作是否有重复键值的判断,直接插入。
mymap.insert(pair<string, int>(str, 1));

11、key_comp()

功能:取得一个比较对象的副本以对 map 容器中的元素进行排序。

语法:key_compare key_comp() const;

说明:存储对象定义了一个成员函数:bool operator(const Key& _Left,const Key& _Right);当_Left 与_Right 在次序比较中不同时,返回 true,否则返回 false。

函数返回值:取得一个对 map 容器中的元素进行排序的比较对象。

12、lower_bound()

功能:求出指向第一个关键字的值是大于等于一个给定值的元素的定位器。

语法:iterator lower_bound(const Key& _Key);
            const_iterator lower_bound(const Key& _Key) const;

说明:_Key 是一个用于排序的关键字。当返回值为一个 const _iterator,则 map 容器不会被修改。当返回值为一个 iterato,,则 map 容器可被修改。

函数返回值:返回一个指向第一个关键字的值是大于等于一个给定值的元素的定位器,或者返回指向 map 容器的结束的定位器。

13、map()

功能:map 的构造函数。

语法:map();

            explicit map(const Traits& _Comp);

            explicit map(const Traits& _Comp,const Allocator& _Al);

            map(const _map& _Right);

            template<class InputIterator> map(InputIterator _First,InputIterator _Last);

            template<class InputIterator> map(InputIterator _First,InputIterator _Last,const Traits& _Comp);

            template<class InputIterator> map(InputIterator _First,InputIterator _Last,const Traits& _Comp,const Allocator& _Al);

说明:_Al表示一个分配器类;_Comp表示一个用于比较的函数,它的默认值为 hash_compare;_Right表示一个 map 的拷贝;_First表示被拷贝的第一个元素的位置;_Last表示被拷贝的最后一个元素的位置。

所有的构造函数都存储一个分配器和初始化 map 容器。所有的构造函数都存储一个 Traits 类型的函数对象,它用于对 map 容器的元素进行排序。头三个构造函数创建一个空的初始 map 容器。第四个构造函数创建一个_Right 容器的副本。后三个构造函数拷贝在范围_First~_Last 内的一个 map 容器。

14、max_size()

功能:计算 map 容器的最大长度。

语法:size_type max_size()const;

说明:max_size 会返回 map 容器的最长度。

函数返回值:返回 map 容器可能的最大长度。

15、operator[]

功能:将一个给定的值插入到 map 容器中去。

语法:Type& operator[](const Key& _Key);

说明:_Key 是被插入的元素的关键字的值。

注意:当 map 容器中找不到_Key 的值时,则插入到 map 容器中,且值是一个默认值。

函数返回值:返回一个_Key 位置的元素的地址(reference)。

16、operator!=

功能:测试该 map 容器的左边与右边是否相同。

语法:bool operator!=(const map <Key,Type,Traits,Allocator>& _Left,const map <Key,Type, Traits, Allocator>& _Right);

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器相等,当且仅当它们的元素个数相等且同一个位置上的值相等。

函数返回值:当_Left 和_Right 不同时,返回 True,否则返回 False。

17、operator<

功能:测试该 map 容器的左边是否小于右边。

语法:bool operator==(const map <Key, Type, Traits, Allocator>& _Left,const map <Key, Type, Traits, Allocator>& _Right);

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器的大小比较是基于第一个不相同的元素的大小比较。

函数返回值:当_Left<_Right 时,返回 True,否则返回 False。

18、operator<=

功能:测试左边的 map 容器是否小于或等于右边。

语法:bool operator<(const map <Key, Type, Traits, Allocator>& _Left, const map <Key, Type, Traits, Allocator>& _Right);

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器的大小比较是基于第一个不相同的元素的大小比较。

函数返回值:当_Left<=_Right 时,返回 True,否则返回 False。

19、operator==

功能:测试左边的 map 容器与右边是否相同。

语法:bool operator==(const map <Key, Type, Traits, Allocator>& _Left,const map <Key, Type, Traits, Allocator>& _Right);

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器相等,当且仅当它们的元素个数相等且同一个位置上的值相等。

函数返回值:当_Left 和_Right 相同时,返回 True,否则返回 False。

20、operator>

功能:测试左边的 map 容器是否大于右边。

语法:bool operator>(const map <Key, Type, Traits, Allocator>& _Left,const map <Key, Type, Traits, Allocator>& _Right)

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器的大小比较是基于第一个不相同的元素的大小比较。

函数返回值:当_Left>_Right 时,返回 True,否则返回 False。

21、operator>=

功能:测试左边的 map 容器是否大于或等于右边。

语法:bool operator>=(const map <Key, Type, Traits, Allocator>& _Left,const map <Key, Type, Traits, Allocator>& _Right);

说明:_Left 和_Right 是待比较的两个 map 容器。两个 map 容器的大小比较是基于第一个不相同的元素的大小比较。

函数返回值:当_Left>=_Right 时,返回 True,否则返回 False。

22、rbegin()

功能:返回一个指向反向 map 容器的第一个元素的定位器。

语法:const_reverse_iterator rbegin()const;

            reverse_iterator rbegin();

说明:rbegin 与反向 map 容器一起使用,它的作用与 map 容器中的 begin 一样。当返回值为一个 const _reverse _iterator,则 map 容器不会被修改。当返回值为一个 reverse _iterator,则 map 容器可被修改。

函数返回值:返回一个指向反向 map 容器的第一个元素的反向双向定位器。

23、rend()

功能:返回一个指向反向 map 容器的最后元素后面的定位器。

语法:const_reverse_iterator rend() const;

            reverse_iterator rend();

说明:rend 与反向 map 容器一起使用,它的作用与 map 容器中的 end 一样。当返回值为一个 const _reverse _iterator,则 map 不会被修改。当返回值为一个 reverse _iterator,则 map 可被修改。

函数返回值:返回一个指向反向 map 容器中的最后一个元素后面的反向双向定位器。

24、size()

功能:计算 map 容器的大小。

语法:size_type size() const;

说明:size 函数会计算出 map 容器的长度。

函数返回值:当前 map 容器的长度。

25、swap()

功能:交换两个 map 容器的元素。

语法:void swap(map& _Right);

说明:_Right 是与目标容器交换元素的 map 容器。

26、upper_bound()

功能:求出指向第一个关键字的值是大于一个给定值的元素的定位器。

语法:iterator upper_bound(const Key& _Key);

            const_iterator upper_bound(const Key& _Key) const;

说明:_Key 是一个用于排序的关键字。当返回值为一个 const _iterator,则 map 容器不会被修改。当返回值为一个 iterator,则 map 容器可被修改。

函数返回值:返回一个指向第一个关键字的值是大于一个给定值的元素的定位器,或者返回指向 map 容器的结束的定位器。

27、value_comp()

功能:返回一个能确定元素的次序的函数。

语法:value_compare value_comp() const;

说明:对于容器 m,当 e1(k1,d1)和 e2(k2,d2)是它的两个元素,则:m.value_comp(e1,e2)=m..key_com(k1,k2)

函数返回值:返回一个能确定元素的次序的函数。