01、文章目录
02、浅谈Map容器
map是STL的一个关联容器,它提供一对一的hash。
第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);
map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
比如我们的身份证号:每个号码对应一个名字,号码就是key、名字就是值。值可以重复,但是号码不会,在公民数据库里面就是这么保存的。
map的功能非常强大:自动建立key - value的对应。key 和 value可以是任意你需要的类型。
使用须知:由于map是标准模板库,他被嵌在了很多编译器里面(这里用Visual Studio举例),我们要使用map容器,只需要包含头文件#include <map>即可。
map构成:map对象是模板类,需要关键字和存储对象两个模板参数:std:map<int, CString> M1;
这样就定义了一个用int作为索引,并拥有相关联的指向CString的指针.(CString是MFC中的类型),一般来说,在MFC中使用STL容器都需要加上命名空间,不然会报错(加头文件的前提下)。
03、Map成员方法表
方法(Function) | 描述(Descriptation) |
---|---|
begin() | 返回指向map头部的迭代器 |
end() | 返回指向map末尾的迭代器 |
clear() | 删除所有元素 |
count() | 返回指定元素出现的次数 |
empty() | 如果map为空则返回true |
equal_range() | 返回特殊条目的迭代器对 |
erase() | 删除一个元素 |
find() | 查找一个元素 |
get_allocator() | 返回map的配置器 |
insert() | 插入元素 |
key_comp() | 返回比较元素key的函数 |
lower_bound() | 返回键值>=给定元素的第一个位置 |
max_size() | 返回可以容纳的最大元素个数 |
rbegin() | 返回一个指向map尾部的逆向迭代器 |
rend() | 返回一个指向map头部的逆向迭代器 |
size() | 返回map中元素的个数 |
swap() | 交换两个map |
upper_bound() | 返回键值>给定元素的第一个位置 |
value_comp() | 返回比较元素value的函数 |
04、成员方法演示示例
PS:下面所有示例,只展示核心代码,并非完整代码,望悉知!
- insert
/* insert 方法*/
1、pair
2、make_pair
3、value_type
4、数组插入法
//上述四种方法,下面举例,后面所有插入操作都用此处的例子数据
//前三种方法当出现重复键时,编译器会报错,而第四种方法,当键重复时,会覆盖掉之前的键值对。
/*
*第一种 数组插入法
*/
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';
/*
*第二种 pair,数据插入一个,举一反三即可
*/
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
//下面操作仅仅只是判断是否插入成功,可有可无,如没有,插入失败程序会崩溃
if(pair.second == true)
{
cout << "数据插入成功!" << endl;
} else {
cout << "数据插入失败!" << endl;
}
/*
*第三种 make_pair,同上
*/
map<int,char> M;
M.insert(make_pair<int,char>(1,'A'));
/*
*第四种 value_type,同上
*/
map<int,char> M;
M.insert(map<int,char>::value_type(1,'A'));
- begin()/end()
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';
map<int,char>::iterator bt = M.begin();
map<int,char>::iterator et = M.end();
for(bt,bt != et,bt++)
{//遍历整个map集合,得到所有value
cout << bt->second << endl;
}
- count()
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
cout << M.count(1) << endl; //返回键值为1的元素出现的个数
- clear()
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
cout << "执行clear()前:" << endl;
for(map<int,char>::iterator it = M.begin(),it != M.end(), it++)
{
cout << it->second;
}
M.clear();
cout << endl;
cout << "执行clear()后:" << endl;
for(map<int,char>::iterator it = M.begin(),it != M.end(), it++)
{
cout << it->second; //此时为NULL
}
- empty()
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';
bool m_bCheakNull = M.empty();
if(m_bCheakNull)
{
cout << "map 为NULL!" << endl;
}
M.clear();
m_bCheakNull = M.empty();
if(!m_bCheakNull)
{
cout << "map 不为NULL!" << endl;
}
- erase()
/*
void erase( iterator pos ); //删除指定位置的元素
void erase( iterator start, iterator end ); //删除start迭代器与end迭代器之间的所有元素
size_type erase( const KEY_TYPE &key ); //删除所有键为key的元素,并返回删除的个数
*/
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
for(map<int,char>::iterator it = M.begin(); it != M.end();i++)
{
cout << it->second << endl;
}
M.erase(M.begin()); //B,C,D
M.erase(M.being(),M.end()); //删除全部,为NULL
M.erase(1); //删除键为1的所有元素,并返回其删除的个数
- find()
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
//iterator find( const KEY_TYPE &key );
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
map<int,char>::iterator CurIt = M.find(3);
//此处给到了一种得到当前迭代器的方法,知道当前的键的情况下
- max_size()
max_size()函数返回map能够保存的最大元素个数。
//size_type max_size();
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
int nNum = M.max_size();
cout << "map容器容量最大为:" << nNum << endl; //178956970
- size()
size()函数返回map中保存的元素个数。
//size_type size();
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
int Num = M.size();
cout << "当前map的个数为: " << Num << endl;
- swap()
swap()交换obj和现map中的元素。
//void swap( map& obj );
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));
for(map<int,char>::iterator it = obj.begin(); it != obj.end(); it++)
{
cout << it->second << endl;
}
//swap作为谓词使用,TODO
for(map<int,char>::iterator it = obj.begin(); it != obj.end(); it++)
{
cout << it->second << endl; //顺序和上面颠倒
}
05、小结
关于Map容器我主要写了几个常用的例子,其余的,比如配置器、逆方向这里不多提,基本一样,大家可以动手试试。
要是有错误的地方欢迎大家指出,谢谢!
版权声明:转载请注明出处,谢谢!