为包含指针的关联容器指定比较类型

一、等价与相等的简述

  在容器中,等价并不是相等。为什么要提等价与相等呢?因为泛型算法中的find等用于比较的是相等,即以operator==为基础,而容器成员函数的比较是以operator<为基础,所以区分二者很重要。

 1、相等

  这个很好理解,operator==返回真即代表二者相等。注:二者相等只是函数返回真,具体规则程序员可以指定的。

 2、等价

  等价关系是以“在已排序的区间中对象值的相对顺序”为基础的(Effective STL).set map排序时,就是默认的使用这种方式。即每一个都不在另一个前面。代码示意为:

  

!(w1 < w1) && ! (w2 < w1)

 3、一个忽略大小写的set程序实现:其中,忽略大小写的set执行的比较类型。

  

 1 #include <string>
 2
 3 struct CIStringCompare{
 4     bool operator()(const std::string& lhs, const std::string& rhs) const
 5     {
 6         int flag =  ciStringCompare(lhs, rhs);
 7         if (flag < 0) return true;
 8         else return false;
 9     }
10     int ciStringCompare(const std::string &lhs, const std::string &rhs) const
11     {
12         return _stricmp(lhs.c_str(), rhs.c_str());
13     }
14 };
 1 #include <set>
 2 #include <iostream>
 3 #include "CIStringCompare.h"
 4 #include <algorithm>
 5 int main()
 6 {
 7     // 区分大小写
 8     std::set<std::string> oriset;
 9     oriset.insert("FuckC++");
10     oriset.insert("fuckc++");
11
12     // 不分大小写
13     std::set<std::string, CIStringCompare> testset;
14     testset.insert("FuckC++");
15     testset.insert("fuckc++");
16
17     std::cout << "区分大小写" << std::endl;
18     for_each(oriset.begin(), oriset.end(), [](const std::string& s)->void{std::cout << s << std::endl; });
19
20     std::cout << "不区分大小写" << std::endl;
21     for_each(testset.begin(), testset.end(), [](const std::string& s)->void{std::cout << s << std::endl; });
22     return 0;
23 }

  显然,执行结果如下:

                            

二、待续

时间: 2024-07-28 15:54:37

为包含指针的关联容器指定比较类型的相关文章

条款20:为指针的关联容器指定比较类型

考虑一下特殊情况: set<string*> ssp; // ssp = "set of string ptrs"ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat"));ssp.insert(new string("Lemur"));ssp.insert(new string("Penguin")); 我们希望set

[C++]高效使用关联容器的一些建议

关联容器 本文介绍在关联容器中常见的一些的问题以及提升使用关联容器的建议. 1. 理解相等(equality)和等价(equivalence)的区别. 相等是以operator==为基础的.等价是以operator<为基础的. 例如find的定义是相等,他用operator==来判断,这是比较容易理解的. 而等价关系是以"在已排序的区间中对象值的相对顺序"为基础的.也就是说,如果两个值中任何一个(按照既定的排列顺序)都在另一个的前面,那么他们就是等价的. !(w1 < w2

Effective STL --关联容器

高效STL-关联容器 标准关联容器中最重要的就是基于等价而不是相等.比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的.因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less).等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数 必须为指针的关联容器指定比较类型 一定要明确对于一个容器来说,容器内的迭代器是存入该容器对象的指针,比如一个关联容器存入指针类型,那么使用这个容器的

无序关联容器(C++11)

2012-11-27 15:22 张海龙/袁国忠 译 人民邮电出版社 字号:T|T <C++Primer Plus(第6版)(中文版)>附录G标准模板库方法和函数:本附录总结了STL容器方法和通用的STL算法函数.本节为大家介绍无序关联容器(C++11). AD: G.4  无序关联容器(C++11) 前面说过,无序关联容器(unordered_set.unordered_multiset.unordered_map和 unordered_multimap)使用键和哈希表,以便能够快速存取数据

C++11(10):关联容器

关键字有序保存元素, map,关联数组,保存关键字-值对, set,关键字即值,只保存关键字的容器 multimap,关键字可重复出现 multiset, 无序集合 unordered_map,用哈希函数组织的map unordered_set,用哈希函数组织的set unordered_multimap,哈希组织的map:关键字可重复出现 unordered_multiset,哈希组织的set:关键字可重复出现 通常map称为关联数组,与数组不同的是其下标不必是整数 //统计每个单词在输入中出

CH11 关联容器

关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-value对:关键字是用来索引值关联的数据.set:每个关键字值包含一个关键字. 关联容器类型: map 保存key-value  map<key,value> set 保存关键字key set<key> multimap 关键字可以重复出现的map multiset 关键字可以重复出现的

《C++primer(第五版)》学习之路-第十一章:关联容器

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 11.1 使用关联容器 1. 关联容器类型 按关键字有序保存元素 map                    关联数组,保存关键字-值对 set                      关键字即值,即只保存关键字的容器 multimap            关键字可重复出现的map multiset              关键字可重复出现的set 无序集合 unordered_ma

关联容器总结

1.容器类型 按关键字有序保存元素: map:用来保存键值对,关键字不可以重复 set:只保存关键字,关键字不可重复 multimap:用来保存键值对,关键字可以重复 multiset:只保存关键字,关键字可以重复 无序集合: unordered_map:用哈希函数组织的map unordered_set:用哈希函数组织的set unordered_multimap:用哈希函数组织的map,关键字可重复 unordered_multiset:用哈希函数组织的set,关键字可重复 2.定义和初始化

【足迹C++primer】38、关联容器操作(1)

关联容器操作 关联容器中还定义了三个类型,如下: set<string>::value_type v1; //这个v1是string类型 set<string>::key_type v2; //这个v2是string类型 map<string, int>::value_type v3; //v3是pair类型pair<const string, int> map<string, int>::key_type v4; //v4是string类型 m