【问题标题】:lexicographic comparison of strings [case-insensitive]字符串的字典比较[不区分大小写]
【发布时间】:2016-11-06 05:17:44
【问题描述】:

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

排序字符串会产生另一个问题;关系运算符使用 ASCII 值,所以

betty < Diane 在应该为真时为假。

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

如何按字典顺序设置?

【问题讨论】:

  • 这比你想象的要容易:std::string 已经在使用字典比较。
  • 你这是什么意思? @someprogrammerdude
  • 如果您想学习而不是使用 STL 让事情变得更容易,请尝试实现自己的基数排序。
  • 它不像我要求代码大声笑,只是想要一些解释

标签: c++ string sorting case-insensitive lexicographic


【解决方案1】:

方法:

  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 
    

    【讨论】:

    • 这是错误的。不是不区分大小写的搜索。阅读完整的问题。
    【解决方案3】:

    使用 compareToIgnoreCase 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多