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

时间:2016-11-06 05:17:45

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

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

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

当它应该是真的时,

betty < Diane是假的。

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

我如何按字典顺序设置?

3 个答案:

答案 0 :(得分:2)

方法:

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

  3. myVec是您要查找的按字典顺序排列的列表。 您需要实施convert_to_lower_case(word)

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

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

答案 1 :(得分:1)

这不符合您的要求吗?

#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 

答案 2 :(得分:0)

使用compareToIgnoreCase方法