Поскольку вы выполняете поиск по подстроке (std :: string), а не по элементам (символам), к сожалению, не существует никакого существующего решения, о котором я знаю, оно было бы доступно в стандартной библиотеке для этого.
Тем не менее, это достаточно просто сделать: просто преобразовать обе строки в верхний регистр (или оба в нижний регистр - я выбрал верхний регистр в этом примере).
std::string upper_string(const std::string& str)
{
string upper;
transform(str.begin(), str.end(), std::back_inserter(upper), toupper);
return upper;
}
std::string::size_type find_str_ci(const std::string& str, const std::string& substr)
{
return upper(str).find(upper(substr) );
}
Это не быстрое решение (граничит с пессимизациейтерритория) но это единственное, что я знаю о безрассудстве.Также не так сложно реализовать свой собственный нечувствительный к регистру искатель подстрок, если вы беспокоитесь об эффективности.
Кроме того, мне нужно поддерживать std :: wstring / wchar_t.Любые идеи?
tolower / toupper в локали также будет работать с широкими строками, поэтому приведенное выше решение должно быть таким же применимым (простое изменение std :: string на std :: wstring).
[Редактировать] Альтернативой, как было указано, является адаптация вашего собственного нечувствительного к регистру типа строки из basic_string путем указания ваших собственных черт характера.Это работает, если вы можете принять все строки поиска, сравнения и т. Д. Без учета регистра для данного типа строки.