読者です 読者をやめる 読者になる 読者になる

Boost String Algorithms Libraryの使い方 その2:文字列比較系関数

C++ Tips

残念ながら、比較系の関数群はC++Builder2010では動作しない。ソースは不本意ながらも(マテ)Visual Studio 2008で動作したのをコピペ。

1.contains/starts_with/ends_with

containsは文字列を「含んでいる」か、starts_withは「始まっているか」、ends_withは「終わっている」かをチェックする。 関数名の先頭にiがつくと大文字小文字を区別しないバージョン。

#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>  

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring s(L"aaabbbccc");

    if (boost::contains(s, L"b")) {
        std::cout << "ok!!" << std::endl;
    } else {
        std::cout << "failed!!" << std::endl;
    }

    return 0;
}

2.lexicographical_compare

lexicographical_compareは辞書順の比較。要するに"operator<"。3番目の引数に関数オブジェクトを渡して比較方法をコントロールすることが出来る。これはcontains/starts_with/ends_withも同様。

#include <stdlib.h>
#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>  

bool comp_str(const wchar_t c1, const wchar_t c2)
{
    wchar_t ic1 = toupper(c1);
    wchar_t ic2 = toupper(c2);

    return ic1 < ic2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring s1(L"Aa");
    std::wstring s2(L"aa");

    // 普通に比較
    if (boost::lexicographical_compare(s1, s2)) {
        std::cout << "ok!!" << std::endl;
    } else {
        std::cout << "failed!!" << std::endl;
    }

    // 比較関数オブジェクトによって大文字小文字を無視して比較
    if (boost::lexicographical_compare(s1, s2, comp_str)) {
        std::cout << "ok!!" << std::endl;
    } else {
        std::cout << "failed!!" << std::endl;
    }

    return 0;
}