STL - Map - 运行期自定义排序
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 ----------------
技术改变世界