转载: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 屏蔽排序的更多相关文章

  1. 对std::map进行排序

    1.对Key排序. std::map的第三个参数即为对key进行排序的比较函数.默认为less,表示升序.如果要降序,可以改为greater. 2.对Value排序 不支持,因为map不是一个序列的容 ...

  2. std::map 自定义排序

    PS:开发中难免会用到快速检索的数据结构-map , 很多时候map自身提供的排序不能满足我们的需要或者不支持我们自定的数据结构的排序,解决办法就是自己实现排序. 这里的小案例是:我们要经用户的has ...

  3. STL之std::set、std::map的lower_bound和upper_bound函数使用说明

    由于在使用std::map时感觉lower_bound和upper_bound函数了解不多,这里整理并记录下相关用法及功能. STL的map.multimap.set.multiset都有三个比较特殊 ...

  4. C++中vector,set,map自定义排序

    一.vector排序 vector支持cmp,就类似数组,可以直接sort. #include <iostream> #include <algorithm> #include ...

  5. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

  6. C++ std::map

    std::map template < class Key, // map::key_type class T, // map::mapped_type class Compare = less ...

  7. std::map用法

    STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用.    在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...

  8. C++ std::map::erase用法及其陷阱

    1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...

  9. std::map

    1.例: map<int,string> m_mapTest; m_mapTest.insert(make_pair(1,"kong")); m_mapTest.ins ...

随机推荐

  1. MyCat教程四:实现读写分离

    本文我们来给大家介绍下通过MyCat来实现MySQL的读写分离操作 MyCat读写分离 一.读写分离配置   前面我们已经介绍过了mysql的主从同步和mycat的安装及相关配置文件的介绍,现在我们来 ...

  2. Zebra-打印特殊字符

    Zebra在打印一些特殊的字符时,会出异常. 在要打印的字符串前加  ^FH  然后将字符换成 ASCii编码或utf-8编码的16进制,在前面加_,如D094写成_DO_94 查看字符的编码 htt ...

  3. elasticsearch使用ansj分词器

    目前elasticsearch的版本已经更新到7.0以上了,不过由于客户需要5.2.2版本的elasticsearch,所以还是需要安装的,并且安装上ansj分词器.在部署ES的时候,采用容器的方式进 ...

  4. SaltStack--快速入门

    saltstack快速入门 saltstack介绍 Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯 主要功能远程执 ...

  5. Kotlin匿名函数与闭包详解

    Lambda表达式实例演练: 继续先来编写一些Lambda表达式相关的代码: 接下来想从上面的字符串数组中找到带有"h"的字符串并打印出来: 如果学习了Java8的Lambda表达 ...

  6. 一次性开启discuz所有版块的 [audio] [video] [flash] 等多媒体代码

    开启全部版块的sql语句是: update cdb_forums set allowmediacode =1 开启指定版块的sql语句是: update cdb_forums set allowmed ...

  7. JQuery系列(8) - JQuery插件开发

    所谓“插件”,就是用户自己新增的jQuery实例对象的方法.由于该方法要被所有实例共享,所以只能定义在jQuery构造函数的原型对象(prototype)之上.对于用户来说,把一些常用的操作封装成插件 ...

  8. LVS是什么及作用?

    LVS的概念和重要性 LVS: 概念:是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统 作用:举例 像有三个小区,但是工作的时间和休息的时间不一样 ...

  9. nginx中的url转发

    公司老项目是python做的,作为一个学java的,现在让我去重构这个项目的一部分页面,所以决定用java来重做,然后通过nginx url转发来实现两个项目的无缝衔接,好了 接下来看如何配置URL转 ...

  10. gevent.queue

    目录 Gevent gevent基础之阻塞,非阻塞 同步,异步概念 同步异步与阻塞,非阻塞区别 Queue python内置Queue介绍 Gevent gevent基础之阻塞,非阻塞 1.geven ...