Если бы ugly's проблема, я просто переключил бы таблицу стилей для пользовательской. Если Вы не хотите перезаписывать сгенерированный, можно использовать плагин Firefox как Стильный .
Вам нужно использовать boost :: iterator_range. Это работает:
typedef const boost::iterator_range<std::string::const_iterator> StringRange;
std::string str1("Hello world");
std::string str2("hello");
if ( boost::ifind_first(
StringRange(str1.begin(), str1.end()),
StringRange(str2.begin(), str2.end()) ) )
std::cout << "Found!" << std::endl;
РЕДАКТИРОВАТЬ: Использование const iterator_range в typedef позволяет передавать временный диапазон.
Примерно так будет выполняться сравнение строк без учета регистра без изменения ни одной строки.
int nocase_cmp(const string & s1, const string& s2)
{
string::const_iterator it1=s1.begin();
string::const_iterator it2=s2.begin();
//stop when either string's end has been reached
while ( (it1!=s1.end()) && (it2!=s2.end()) )
{
if(::toupper(*it1) != ::toupper(*it2)) //letters differ?
// return -1 to indicate smaller than, 1 otherwise
return (::toupper(*it1) < ::toupper(*it2)) ? -1 : 1;
//proceed to the next character in each string
++it1;
++it2;
}
size_t size1=s1.size(), size2=s2.size();// cache lengths
//return -1,0 or 1 according to strings' lengths
if (size1==size2) {
return 0;
}
return (size1<size2) ? -1 : 1;
}
(char *) str.c_str ()
фактически выполняет const_cast
: const_cast
. Я очень сильно сомневаюсь, что нужно отбросить const
для поиска по строке.
Я никогда не использовал boost :: ifind_first
, но согласно документации , функция принимает два диапазона. Я полагаю там ' Как создать диапазон из строки? OTOH, я бы подумал, не идеальный ли диапазон для струны.
Может быть полезно публиковать полные сообщения об ошибках используемого компилятора.