C++ std::map 屏蔽排序
转载:https://blog.csdn.net/sendinn/article/details/96286849
最近在项目中用标准库中的关联性容器map,但知道map默认升序的,但在一个需求时又不想让它排序,保持元素原始位置。原先查了资料发现,标注库中有不排序的map,可以重写map的第三个比较函数,但实际使用中发现,用了自定义的比较函数,map的find函数没法用。
unordered_map:
包含头文件 #include<unordered_map>
关联性:std::unorederd_map 是一个关联容器,其中的元素根据键来引用,而不是根据索引来引用。
无序性:在内部,std::unordered_map中的元素不会根据其键值或映射值按任何特定顺序排序,而是根据其哈希值组织到桶中,以允许通过键值直接快速访问各个元素(常量的平均时间复杂度)。
唯一性:std::unorederd_map中的元素的键是唯一的。
void testUnordermap()
{
std::unordered_map<std::string, int> unm;
unm["d"] = ;
unm["c"] = ;
unm["b"] = ;
unm["a"] = ;
unm["a"] = ; std::unordered_map<std::string, int>::iterator iter1 = unm.begin();
for (; iter1 != unm.end(); iter1++)
{
std::cout << "unordered_map: " << iter1->first.c_str() << std::endl;
} unm["j"] = ;
}
运行结果:

map:
在网上查资料说,map容器有4个参数,其中影响自动排序的是第三个参数,只要保证为true即可。
上给出的多是直接返回true或是if (lhs == rhs) return false; return true;(加了相同的key则默认处理返回false的条件)
但是其实map如果想第三个参数返回true需要经过两次比较,如果第一次返回true那么会把左右参数对调再判断一次,这一次则要返回false,才能无序排列,所以要多加些条件。
#include <iostream>
#include <unordered_map>
#include <map> template<class T>
struct DisableCompare : public std::binary_function<T,T,bool>
{
bool operator()(T lhs,T rhs)const
{
static bool disblecompare = false;
if (lhs == rhs)
{
return false;
}
if (disblecompare)
{
disblecompare = false;
return false;
}
else
{
disblecompare = true;
return true;
}
}
}; void test()
{
std::map<std::string, int, DisableCompare<std::string>> m;
m["d"] = ;
m["c"] = ;
m["b"] = ;
m["a"] = ;
m["a"] = ; std::map<std::string, int>::iterator iter = m.begin();
for (; iter != m.end();iter++)
{
std::cout << "map: " << iter->first.c_str() << std::endl;
}
std::map<std::string, int>::iterator iter1 = m.find("d");
} int main()
{
test();
getchar();
return ;
}

如果只想不排序,不用find的话,可以采用这种方法,但实际需求,一般都会使用map的find函数,所以在此还需要想其他办法。
也许不是这种特殊需求,我们只知道用map,并利用它的默认排序,知识的积累真是一点一滴的,没有捷径。
C++ std::map 屏蔽排序的更多相关文章
- 对std::map进行排序
1.对Key排序. std::map的第三个参数即为对key进行排序的比较函数.默认为less,表示升序.如果要降序,可以改为greater. 2.对Value排序 不支持,因为map不是一个序列的容 ...
- std::map 自定义排序
PS:开发中难免会用到快速检索的数据结构-map , 很多时候map自身提供的排序不能满足我们的需要或者不支持我们自定的数据结构的排序,解决办法就是自己实现排序. 这里的小案例是:我们要经用户的has ...
- STL之std::set、std::map的lower_bound和upper_bound函数使用说明
由于在使用std::map时感觉lower_bound和upper_bound函数了解不多,这里整理并记录下相关用法及功能. STL的map.multimap.set.multiset都有三个比较特殊 ...
- C++中vector,set,map自定义排序
一.vector排序 vector支持cmp,就类似数组,可以直接sort. #include <iostream> #include <algorithm> #include ...
- std::map使用结构体自定义键值
使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...
- C++ std::map
std::map template < class Key, // map::key_type class T, // map::mapped_type class Compare = less ...
- std::map用法
STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用. 在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...
- C++ std::map::erase用法及其陷阱
1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...
- std::map
1.例: map<int,string> m_mapTest; m_mapTest.insert(make_pair(1,"kong")); m_mapTest.ins ...
随机推荐
- zabbix--邮件告警
zabbix 邮件告警机制 通过腾讯企业邮箱进行告警通知等.邮箱服务器账号需要在邮箱设置里面进行设置,开通ssl认证及专用密码 参考官档:https://www.zabbix.com/document ...
- 基于gin web框架搭建RESTful API服务
这篇主要学习go项目中的项目结构.项目规范等知识,ROM采用的database/sql的写法. 1.技术框架 利用的是ginweb框架,然后ROM层选用database/sql,安装mysql驱动.安 ...
- Object类.时间日期类.System类.Stringbuilder类.包装类
Object类 java.lang.Object类是java语言中的根类,即所有类的父类.它中描述的所有方法都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类, ...
- hive删除数据(转)
转自:https://www.cnblogs.com/linn/p/6196293.html 按分区删除: ALTER TABLE test1 DROP PARTITION (dt='2016-04 ...
- 阿里云部署,ubuntu, 连接服务器 |更新源| 安装node |安装mysql
1.连接服务器 xshell 新建连接 ssh root@1.1.1.1 2.更新源 apt-get update 3.安装node apt-get install -y curl curl -sL ...
- POJ2139-Six Degrees of Cowvin Bacon-(Floyd_Warshall)
题意:有n只牛拍电影m部电影,知道每部电影有哪些牛参与,一起拍电影的牛之间维度为1,ab拍电影则ab之间的维度为1,如果bc一起拍电影,ac没有一起,则ac之间的维度为2,以此类推.求哪知牛到所有牛之 ...
- 树莓派项目(三) 数字识别树莓派3+python3.5+opencv3.3+tensorflow1.7+keras
https://blog.csdn.net/weixin_40707450/article/details/80290705
- Good Article Good sentence HDU - 4416 (后缀数组)
Good Article Good sentence \[ Time Limit: 3000 ms\quad Memory Limit: 32768 kB \] 题意 给出一个 \(S\) 串,在给出 ...
- 常见WinDbg问题及解决方案
当你调试一个程序时,你最不想处理的是调试器不能正常工作.当你试图集中精力跟踪一个bug时,总是会因为次要的问题而被忽略,尤其是当调试器的问题导致你失去一个重新编程或者浪费了大量的时间等待调试器完成它, ...
- 请找出"aaaabbcccdddd"字符串中出现最多的字母
function getCount(str) { for(var code=32;code<128;code++){ var mych=String.fromCharCode(code); va ...