STL - Map - 运行期自定义排序
2023-09-11 14:16:56 时间
RuntimeStringCmp.cpp
#include <string> using namespace std; // function object to compare strings // - allows you to set the comparison criterion at runtime // - allows you to compare case insensitive class RuntimeStringCmp { public: // constants for the comparison criterion enum cmp_mode { normal, nocase }; private: // actual comparison mode const cmp_mode mode; // auxiliary function to compare case insensitive static bool nocase_compare(char c1, char c2) { return toupper(c1) < toupper(c2); } public: // constructor: initializes the comparison criterion RuntimeStringCmp(cmp_mode m = normal) : mode(m) { } // the comparison bool operator() (const string& s1, const string& s2) const { if (mode == normal) { return s1<s2; } else { return lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), nocase_compare); } } };
MapAdvanceTest.h
#ifndef _Stl_Container_Map_Advance_Test_H_ #define _Stl_Container_Map_Advance_Test_H_ #include "../../TestBase.h" #include <map> class RuntimeStringCmp; typedef map<string, string, RuntimeStringCmp> StringStringMap; class MapAdvanceTest : public TestBase { public: MapAdvanceTest(const string &c, const string &d) : TestBase(c, d) { } void run(); private: ... void runtimeMapCompare(); // private inner method void fillAndPrint(StringStringMap& coll); }; #endif
MapAdvanceTest.cpp
#include <map> #include <string> #include <iostream> #include <iomanip> #include <algorithm> #include <cctype> #include "../../Core/RuntimeStringCmp.hpp" #include "MapAdvanceTest.h" #include "../../Core/ContainerUtil.h" using namespace std; ... void MapAdvanceTest::fillAndPrint(StringStringMap& coll) { // insert elements in random order coll["Deutschland"] = "Germany"; coll["deutsch"] = "German"; coll["Haken"] = "snag"; coll["arbeiten"] = "work"; coll["Hund"] = "dog"; coll["gehen"] = "go"; coll["Unternehmen"] = "enterprise"; coll["unternehmen"] = "undertake"; coll["gehen"] = "walk"; coll["Bestatter"] = "undertaker"; // print elements cout.setf(ios::left, ios::adjustfield); for (const auto& elem : coll) { cout << setw(15) << elem.first << " " << elem.second << endl; } cout << endl;
cout << "#############################################" << endl;
} void MapAdvanceTest::runtimeMapCompare() { // create a container with the default comparison criterion StringStringMap coll1; fillAndPrint(coll1); // create an object for case-insensitive comparisons RuntimeStringCmp ignorecase(RuntimeStringCmp::nocase); // create a container with the case-insensitive comparisons criterion StringStringMap coll2(ignorecase); fillAndPrint(coll2); } void MapAdvanceTest::run() { printStart("runtimeMapCompare()"); runtimeMapCompare(); printEnd("runtimeMapCompare()"); }
运行结果:
---------------- runtimeMapCompare(): Run Start ----------------
Bestatter undertaker
Deutschland Germany
Haken snag
Hund dog
Unternehmen enterprise
arbeiten work
deutsch German
gehen walk
unternehmen undertake
#############################################
arbeiten work
Bestatter undertaker
deutsch German
Deutschland Germany
gehen walk
Haken snag
Hund dog
Unternehmen undertake
#############################################
---------------- runtimeMapCompare(): Run End ----------------
相关文章
- 基于matlab的FP-MAP球形检测算法误码率仿真
- 80 C++ - map/multimap容器
- JAVA Map类compute方法详解及样例
- Java的Map中的map.keySet()方法
- JS——Map对象 Set对象
- Golang slice和map的申明和初始化
- Map容器线程安全问题
- AutoMapper中的Map和DynamicMap——高手注重细节,思考和总结
- Collection与Map的对比
- 浅析Java8新特性-Stream流操作:Stream概念、常见中间/终止操作符、创建stream的3种方式、串行流/并行流的区分、使用示例(遍历/匹配、过滤、聚合、映射、归约、归集、统计、分区分组、接合、排序、组合/提取、分页、并行、集合转Map、使用并行流注意点)
- java list map 根据map的某个key值进行排序
- java实现request请求参数转map工具类
- Dart - 如何对 Map 的键进行排序
- Java Lambda map返回部分属性
- Java小白入门200例110之Java遍历Map集合
- Golang 中使用多维 map
- JAVA array,map 转 json 字符串
- 1131 Subway Map