zoukankan      html  css  js  c++  java
  • STL

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

     

  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/davidgu/p/4974020.html
Copyright © 2011-2022 走看看