// templated version of my_equal so it could // work with both char and wchar_t template<typename charT> struct my_equal { my_equal( const std::locale& loc ) : loc_(loc) {} bool operator()(charT ch1, charT ch2) { return std::toupper(ch1, loc_) == std::toupper(ch2, loc_); } private: const std::locale& loc_; };
Можно написать ещё вспомогательную фукнцию, чтобы не писать каждый раз строку с длинными итераторами:
// find substring (case insensitive) template<typename T> int ci_find_substr( const T& str1, const T& str2, const std::locale& loc = std::locale() ) { T::const_iterator it = std::search( str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal<T::value_type>(loc) ); if ( it != str1.end() ) return it - str1.begin(); else return -1; // not found }
Использовать совсем просто:
// не забываем включить необходимые части #include <locale> #include <iostream> #include <algorithm> using namespace std; int main(int arc, char *argv[]) { // string test std::string str1 = "FIRST HELLO"; std::string str2 = "hello"; int f1 = ci_find_substr( str1, str2 ); // wstring test std::wstring wstr1 = L"ОПЯТЬ ПРИВЕТ"; std::wstring wstr2 = L"привет"; int f2 = ci_find_substr( wstr1, wstr2 ); return 0; }