stl中set和map为关联式容器,会根据排序准将元素自动排序。原型如下:

template<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class set template<class _Kty,
class _Ty,
class _Pr = less<_Kty>,
class _Alloc = allocator<pair<const _Kty, _Ty> > >
class map

默认的排序准则为less<_Kty> 即通过 operator<对元素进行排序。所以如果set里存储的元素或map的key值为自定义的数据类型,必须要重载operator<。

当容器中存储的类型为别人设计,自己无法修改时,则通过自定义排序准则来实现关联式容器的排序功能。

//IntSet默认按less<int> 由小到大排序
typedef set<int> IntSet; //自定义比较器实现由大到小排序
template <typename T> struct ReverseCmp
{
bool operator()(const T & t1, const T & t2)
{
return t2 < t1;
}
}; typedef set<int, ReverseCmp<int> > ReverseIntSet;

最近项目中的一个例子,map<string,int> StrMap 实现该map的key值 string不区分大小写,即StrMap["abc"] 与StrMap["Abc"]为同一元素。

实现如下:

//比较器实现
struct NoCaseCompare
{
bool operator()(const string & str1, const string & str2)
{
string upper_str1(str1);
string upper_str2(str2);
std::transform(upper_str1.begin(),upper_str1.end(),upper_str1.begin(),toupper);
std::transform(upper_str2.begin(),upper_str2.end(),upper_str2.begin(),toupper);
return upper_str1.compare(upper_str2) >= 0 ? false : true;
}
}; typedef map<string, int,NoCaseCompare> StrMap;

测试代码如下:

StrMap TestMap;
TestMap["aBc"] = 1;
TestMap["Cde"] = 2;
StrMap::iterator it;
it = TestMap.find("ABC");
if (it != TestMap.end())
{
  cout << "Key:" << (it->first).c_str() << " value:" << it->second << "\n";
}

运行结果:

Key:aBc value:1

C++关联式容器的排序准则的更多相关文章

  1. vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。

    1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...

  2. STL学习笔记--关联式容器

    关联式容器依据特定的排序准则,自动为其元素排序.缺省情况下以operator<进行比较.set multiset map multimap是一种非线性的树结构,具体的说是采用一种比较高效的特殊平 ...

  3. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

  4. C++ 容器:顺序性容器、关联式容器和容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  5. 7.7 C++基本关联式容器

    参考:http://www.weixueyuan.net/view/6404.html 总结: 基本的关联式容器主要有:set.multiset.map和multimap,这四种容器可以分为两组:ma ...

  6. STL——关联式容器

    一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tre ...

  7. 关联式容器(associative containers)

    关联式容器(associative containers) 根据数据在容器中的排列特性,容器可分为序列式(sequence)和关联式(associative)两种. 标准的STL关联式容器分为set( ...

  8. Map(关联式容器)

    map是一类关联式容器,自动建立Key - Value的对应 , key 和 Value可以是任意你需要的类型.下面介绍 map 中一些常用的函数: 一.map 中的 begin 和 end 函数 m ...

  9. STL学习笔记(关联式容器)

    Set和Multisets set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multisets允许元素重复而set不允许. 1.set和multiset的操作函数 生成.复制 ...

随机推荐

  1. hashSet的底层是数组,其查询效率非常高

    如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率. 我们要保证相同对象的返回的hashCode一定 ...

  2. 子级用css float浮动 而父级div没高度不能自适应高度

    子级对象使用css float浮动 而父级div不能自适应高度. 对父级div标签闭合</div>前加一个clear清除浮动对象. <!DOCTYPE html> <ht ...

  3. 如何编写jQuery插件

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  4. loadruner11 socket脚本-10053错误

    背景: socket 10053异常:软件主动放弃一个连接,原因是超时或协议错误.如果LR客户端报10053异常,说明LR在执行套接字操作时,发生通信超时.网络中断或其它异常,主动将Socket连接断 ...

  5. VC++ 监视文件(夹)

    参考:http://www.cnblogs.com/fangkm/archive/2009/03/31/1426526.html WinFileSystemMonitor.h  C++ Code  1 ...

  6. 使用 Estimator 构建卷积神经网络

    来源于:https://tensorflow.google.cn/tutorials/estimators/cnn 强烈建议前往学习 tf.layers 模块提供一个可用于轻松构建神经网络的高级 AP ...

  7. ItcastOA_设计BaseDao_设计DAO接口和实现类_写DAO实现类中的方法内容

    3. 基础功能 3.1. 设计BaseDao接口与BaseDaoImpl类 每个实体都应有一个对应的Dao,他封装了对这个实体的数据库操作.例 实体Dao接口实现类 ================= ...

  8. 修改UE4的deriveddatacache目录位置,扩大C盘空间

    按照默认安装目录,UE4会装在C盘 C:\Program Files\Epic Games\UE_4.15 DerivedDataCache缓存目录在 C:\Users\你的用户名\AppData\L ...

  9. 设置eclipse中python脚本的编码格式

    今天在运行python脚本时报如下错误: SyntaxError: Non-ASCII character '\xe5' in file D:\pythonlearn1\src\day01\direc ...

  10. codevs 5963 [SDOI2017]树点染色

     [题解]: #include<cstdio> #include<cstring> #include<iostream> using namespace std; ...