лексикографическое сравнение строк [без учета регистра]

Я хочу отсортировать текст файла в лексикографическом порядке, но мне сложно понять, что на самом деле делает лексикографический порядок.

При заказе строк возникает другая проблема; реляционные операторы используют значения ASCII так

betty < Diane ложь, когда это должно быть правдой.

Рассмотрим примерный список:
Бетти, Диана, 123, Ана, Меган, Чарльз, два, 12.

Как бы я установить это в лексикографическом порядке?

0

Решение

Подход:

  1. использование map <convert_to_lower_case(words) as string, index as integer> положить все слова в списке.
  2. После этого создайте отсортированный вектор myVec с помощью:

    for(it_type iterator = m.begin(); iterator != m.end(); iterator++) {
    myVec.push_back(original_list[it->second]);
    }

myVec это лексикографически отсортированный список, который вы ищете.
Вам необходимо реализовать convert_to_lower_case(word) :

for(int i = 0; str[i]; i++){
word[i] = tolower(str[i]);
}

Другой ответ тоже хорош, использует компаратор для сортировки вектора.

2

Другие решения

Разве это не делает то, что вы хотите?

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>

int main() {
std::vector<std::string> v {"Diane", "123", "Ana", "Megan", "charles", "two", "12"};

for (const auto& s : v) {
std::cout << s << ' ';
};
std::cout << '\n';

std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) {
for (int i = 0 ; i < std::min(a.size(), b.size()) ; i++) {
const auto a_char = std::tolower(a[i]);
const auto b_char = std::tolower(b[i]);
if (a_char != b_char) {
return a_char < b_char;
}
}
return a.size() < b.size();
});

for (const auto& s : v) {
std::cout << s << ' ';
};
std::cout << '\n';

return 0;
}

stdout выглядит так:

Diane 123 Ana Megan charles two 12
12 123 Ana charles Diane Megan two
1

По вопросам рекламы [email protected]