[파일명:  testStringFindInList.cpp]------------------------------------------------
#include <iostream>
#include <functional>
#include <algorithm>
#include <string>
#include <list>

using namespace std;

struct SData {
    SData(string s) : m_s(s) {}
    string m_s;
};

namespace std {
    template <> struct greater<SData*> {
        bool operator()(SData const* p1, SData const* p2) {
            //Defined like less for ascending sorting
            if(!p1)
                return true;
            if(!p2)
                return false;
            return p1->m_s < p2->m_s;
        }
    };
};

// Predicate class
class MyPred {
private:
    std::string     m_strForFind;

public:
    // for find_if
    void setQuery(std::string str) {
        m_strForFind = str;
    };

    // operator override for find_if
    bool operator()(SData const* p) {
        if(!p)
            return false;
        int n = (p->m_s).find(m_strForFind);
        int m = (p->m_s).length();
        return n >= 0 && n < m;
    };
};

void printList(list<SData*> lst);

int main() {
    list<SData*> mylist;
    mylist.push_back(new SData("하나"));
    mylist.push_back(new SData("둘"));
    mylist.push_back(new SData("셋"));
    mylist.push_back(new SData("넷"));
    mylist.push_back(new SData("다섯"));
    mylist.push_back(new SData("여섯"));

    cout << "list: ";
    printList(mylist);

    MyPred pred;
    pred.setQuery("셋");
    list<SData*>::iterator it;
    it = find_if(mylist.begin(), mylist.end(), pred);
    if (it != mylist.end()) {
        cout << "발견!  ";
        cout << "Next word of 셋 in list: " << (*(++it))->m_s << endl;
    }

    // Sorting list in ascending order
    cout << "Sorting..." << endl;
    mylist.sort(greater<SData*>());

    cout << "list: ";
    printList(mylist);

    it = find_if(mylist.begin(), mylist.end(), pred);
    if (it != mylist.end()) {
        cout << "발견!  ";
        cout << "Next word of 셋 in list: " << (*(++it))->m_s << endl;
    }

    for (it = mylist.begin(); it != mylist.end(); it++)
        delete *it;

    return 0;
}

void printList(list<SData*> lst) {
    list<SData*>::iterator it;
    list<SData*>::iterator it2;
    cout << "[";
    for (it = lst.begin(); it != lst.end(); it++) {
     it2 = it;
        advance(it2, 1);
        if (it2 == lst.end())
            break;
        cout << (*it)->m_s << ", ";
    }
    if (lst.size() > 0)
        cout << (*it)->m_s;
    cout << "]" << endl;
}
------------------------------------------------


Visual C++의 경우:
컴파일> cl /EHsc testStringFindInList.cpp
또는
Borland C++의 경우:
컴파일> bcc32 testStringFindInList.cpp
또는
Cywin이나 Msys의  g++의 경우:
컴파일> g++ -o testStringFindInList testStringFindInList.cpp

실행> testStringFindInList
list: [하나, 둘, 셋, 넷, 다섯, 여섯]
발견!  Next word of 셋 in list: 넷
Sorting...
list: [넷, 다섯, 둘, 셋, 여섯, 하나]
발견!  Next word of 셋 in list: 여섯


Cywin이나 Msys의  g++의 경우:
실행> ./testStringFindInList
list: [하나, 둘, 셋, 넷, 다섯, 여섯]
발견!  Next word of 셋 in list: 넷
Sorting...
list: [넷, 다섯, 둘, 셋, 여섯, 하나]
발견!  Next word of 셋 in list: 여섯



크리에이티브 커먼즈 라이선스
Creative Commons License

 


Posted by Scripter
,