Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

сортировка строк без учета верхнего регистра букв

#cpp #алгоритм #сортировка #строки #stl


Задача в следующем - отсортировать контейнер со строками без учета верхнего регистра
букв в алфавитном порядке, например: 

std::vector strList = {"Alpha", "Beta", "Gamma", "aaa", "bbb", "ccc"};


Если применить алгоритм сортировки:

std::sort(strList.begin(), strList.end()); 


Результат будет таким:

1) "Alpha"

2) "Beta"

3) "Gamma"

4) "aaa"

5) "bbb"

6) "ccc"

А я хочу без учета верхнего регистра букв:

1) "aaa" 

2) "Alpha" 

3) "bbb" 

4) "Beta"

5) "ccc"

6) "Gamma"

Собственно интересует вопрос есть ли готовые алгоритмы для такого вида сортировок?
Или нужно изобретать велосипед?
    


Ответы

Ответ 1



Используйте компаратор, который будет сравнивать строки без учета регистра: auto cmp = [](const std::string& a, const std::string& b) { return boost::ilexicographical_compare(a, b); }; std::sort(begin(strList), end(strList), cmp);

Ответ 2



Получился такой такой вариант - довольно колхозный и медленный, пожалуйста у кого есть мысли с лучшем вариантом - не стесняемся - выкладываем: std::vector strList = {куча строк} std::sort(proc.begin(), proc.end(), [&](const std::string& elem1, const std::string& elem2) {return strcmpi(elem1.c_str(), elem2.c_str()) < 0; });

Ответ 3



Возможно не самый оптимальный, но рабочий вариант. Возможны оптимизации, связанные с многократным приведением одной и той же строки к lowercase в предикате #include #include #include class SortPredicate { public: bool operator()(const std::string& lhs, const std::string& rhs) const { std::string lhcLower(lhs); std::string rhcLower(rhs); std::transform(lhs.begin(), lhs.end(), lhcLower.begin(), ::tolower); std::transform(rhs.begin(), rhs.end(), rhcLower.begin(), ::tolower); return lhcLower < rhcLower; } }; int main(int argc, const char * argv[]) { std::vector strVec = {"Alpha", "Beta", "Gamma", "aaa", "bbb", "ccc"}; std::sort(strVec.begin(), strVec.end(), SortPredicate()); for(const std::string& item : strVec) { std::cout << item << std::endl; } return 0; } result: aaa Alpha bbb Beta ccc Gamma

Комментариев нет:

Отправить комментарий