字符串的字典比较[不区分大小写]

lexicographic comparison of strings [case-insensitive]

本文关键字:大小写 不区 字典 比较 字符串      更新时间:2023-10-16

我想按字典顺序对文件的文本进行排序,但我很难理解字典顺序的真正作用。

排序字符串产生另一个问题;关系操作符使用ASCII值,因此

betty < Diane应该为真,但却为假。

考虑一个示例列表:贝蒂,黛安,123岁,安娜,梅根,查尔斯,2岁,12岁。

如何按字典顺序设置?

方法:

  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]);
}

另一个答案也很好,使用比较器对向量进行排序。

这不是你想要的吗?

#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 

使用compareToIgnoreCase方法