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

C++ 字符串的字典比较[不区分大小写],c++,string,sorting,case-insensitive,lexicographic,C++,String,Sorting,Case Insensitive,Lexicographic,我想按字典顺序对文件的文本进行排序,但我很难理解字典顺序的真正作用 排序字符串会产生另一个问题;关系运算符使用ASCII值,因此 bettysecond]); } myVec是您要查找的按词典排序的列表。 您需要实现将\u转换为\u小写字母(word): 其他答案也很好,使用比较器对向量进行排序。方法: 使用map将所有单词放入列表中 之后,使用以下方法创建一个排序向量myVec: for(it_type iterator=m.begin();iterator!=m.end();iterator

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

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

betty本应为真,却为假

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


我如何按字典顺序设置它?

这不是你想要的吗

#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;
}

这不是你想要的吗

#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;
}
方法:

  • 使用
    map
    将所有单词放入列表中
  • 之后,使用以下方法创建一个排序向量
    myVec

    for(it_type iterator=m.begin();iterator!=m.end();iterator++){
    myVec.push_back(原始_列表[it->second]);
    }

  • myVec
    是您要查找的按词典排序的列表。 您需要实现
    将\u转换为\u小写字母(word)

    其他答案也很好,使用比较器对向量进行排序。

    方法:

  • 使用
    map
    将所有单词放入列表中
  • 之后,使用以下方法创建一个排序向量
    myVec

    for(it_type iterator=m.begin();iterator!=m.end();iterator++){
    myVec.push_back(原始_列表[it->second]);
    }

  • myVec
    是您要查找的按词典排序的列表。 您需要实现
    将\u转换为\u小写字母(word)


    其他答案也很好,使用比较器对向量进行排序。

    使用compareToIgnoreCase方法

    使用compareToIgnoreCase方法

    比你想象的简单:已经在使用词典比较了。你这是什么意思?@如果你想学习而不是使用STL使事情变得更简单,一些编程人员尝试实现你自己的基数排序。这不像我要求代码lol,只是想要一些解释。这比你想象的要容易:已经在使用字典比较了。这是什么意思?@如果你想学习而不是使用STL使事情变得更简单,一些编程人员尝试实现你自己的基数排序。这不像我要求代码lol,只是想要一些解释这是错误的。不是不区分大小写的搜索。阅读完整的问题,这是错误的。不是不区分大小写的搜索。阅读完整的问题。
    for(int i = 0; str[i]; i++){
      word[i] = tolower(str[i]);
    }