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 ----------------

 

posted @ 2015-11-18 11:43  Master HaKu  阅读(742)  评论(0编辑  收藏  举报