接受所有数据类型的不区分大小写的 C++ 排序?

Posted

技术标签:

【中文标题】接受所有数据类型的不区分大小写的 C++ 排序?【英文标题】:Case insensitive c++ sort that accepts all datatypes? 【发布时间】:2016-09-09 15:53:52 【问题描述】:

我对编程还是比较陌生,我已经对如何实现这一点进行了大量研究,但我无法弄清楚。

我一直在使用这种不区分大小写的排序方式:

    for (size_t i = 0; i < copy.size() - 1; i++) //use copy vector to organize in ascending order
    
        int smallest = i;
        for (size_t j = i + 1; j < copy.size(); j++)
        
            if (tolower(copy[j]) < tolower(copy[smallest])) //normalizes capitals and lowercases
                smallest = j;
        
        int temp = copy[smallest];
        copy[smallest] = copy[i];
        copy[i] = temp;
    

在我传入一个字符串类型的向量之前,这可以正常工作。如何使这种排序对所有数据类型通用,同时仍使其不区分大小写?

【问题讨论】:

“对所有数据类型通用,但仍不区分大小写”。不区分大小写仅适用于字符或字符串,而不适用于所有数据类型。 相关/欺骗:***.com/questions/11635/… 我意识到强制转换不敏感适用于字符和字符串,但我的向量可能被初始化为整数,我希望它在任何情况下都能正常工作。 但是如何不区分大小写地对整数进行排序? 所以我需要认识到我的向量是整数并使用不同的排序算法对其进行排序。然后,如果它是字符或字符串,那么我需要使用忽略不区分大小写的字符对其进行排序。我没有办法调用一个排序函数吗? 【参考方案1】:

您可以将std::sort() 与您自己的比较功能一起使用。

顺便说一句,我认为您不需要对所有数据类型不区分大小写。

对于您有问题的评论:如果您想要默认比较,您可以随时忽略第三个参数。

例子:

#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cctype>  //toupper
using namespace std;

bool CompareStringCaseInsensitive(const string& lhs,const string& rhs)

   string::size_type common_length = std::min(lhs.length(),rhs.length());

   for(string::size_type i=0;i<common_length;++i)
      if(toupper(lhs[i]) < toupper(rhs[i]))return true;
      if(toupper(lhs[i]) > toupper(rhs[i]))return false;
   

   if(lhs.length()<rhs.length())return true;
   if(lhs.length()>rhs.length())return false;//can ignore

   return false;//equal should return false


int main()
   vector<string> testdata"a","B","c","D";

   cout << "Sort By Default :" << '\n';
   sort(testdata.begin(),testdata.end());
   for(const auto& s : testdata)cout << s << ' ';
   cout << '\n';

   cout << "Sort CaseInsensitive :" << '\n';
   sort(testdata.begin(),testdata.end(),CompareStringCaseInsensitive);
   for(const auto& s : testdata)cout << s << ' ';

【讨论】:

所以在排序的第三个参数中,我应该调用一个像这里使用的函数:***.com/questions/11635/… 可以,如果不想使用 boost,可以自己实现。

以上是关于接受所有数据类型的不区分大小写的 C++ 排序?的主要内容,如果未能解决你的问题,请参考以下文章

怎样修改sqlserver2005系统数据库排序规则

nvarchar 类型的不区分大小写的主键,其中 ß != ss

在 C# 中具有字符串键类型的不区分大小写字典

带有 mod_rewrite 的不区分大小写的 URL

不区分大小写的操作

如何设置MySQL中表的大小写区分