在C ++中对字符向量进行排序并将大写字母和小写字母视为相同的最佳方法?
Posted
技术标签:
【中文标题】在C ++中对字符向量进行排序并将大写字母和小写字母视为相同的最佳方法?【英文标题】:Best way to sort vector of characters and treat capital and lowercase letters as equal in C++? 【发布时间】:2016-09-08 19:39:14 【问题描述】:我目前拥有的是:
std::vector<char> test = 'a', 'f', 'b', 'g', 'c', 'K', 'E';
int smallest;
for ( int i = 0; i < test.size() - 1; i++)
smallest = i;
for (int j = i + 1; j < test.size(); j++ )
if (test[j] < test[smallest])
smallest = j;
int temp = test[smallest];
test[smallest] = test[i];
test[i] = temp;
将向量测试排序为:E,K,a,b,c,f,g。但是,我想将大写和小写字母视为相等,因此最终结果是:a,b,c,E,f,g,K。实现这一目标的最佳方法是什么?我想一种方法是将大写或小写字母的所有值重置为彼此相等。
【问题讨论】:
基本上您的问题与this 重复。您只需要编写一个在比较字母时忽略大小写的比较函数/functor/lambda。tolower
或 toupper
让这一切变得简单。
【参考方案1】:
最好的方法是使用来自<algorithm>
的std::sort
:
std::sort(v.begin(), v.end(), [](char i, char j) return std::tolower(i) < std::tolower(j); );
其中v
是向量,std::tolower
可以在<cctype>
中找到。如果您无法访问 C++11 lambda,则可以轻松替换它。
【讨论】:
【参考方案2】:您可以将std::sort
与您自己的自定义比较器一起使用,它在每个字母上使用std::tolower
进行不区分大小写的比较
#include <algorithm>
#include <cctype>
#include <iostream>
#include <vector>
int main()
std::vector<char> test = 'a', 'f', 'b', 'g', 'c', 'K', 'E';
std::sort(begin(test),
end(test),
[](char lhs, char rhs)
return std::tolower(lhs) < std::tolower(rhs);
);
for (auto letter: test)
std::cout << letter << std::endl;
Live demo
【讨论】:
【参考方案3】:虽然其他人都在他们的回答中建议了std::sort
,但我会建议使用您的算法的解决方案,就像这样。 (您需要std::tolower
或std::toupper
):
std::vector<char> test = 'a', 'f', 'b', 'g', 'c', 'K', 'E';
int smallest;
for ( int i = 0; i < test.size() - 1; i++)
smallest = i;
for (int j = i + 1; j < test.size(); j++ )
if (std::tolower(test[j]) < std::tolower(test[smallest])) //Or use std::toupper
smallest = j;
int temp = test[smallest];
test[smallest] = test[i];
test[i] = temp;
【讨论】:
虽然其他人都建议使用 std::sort——而且有充分的理由。 OP 使用的算法是冒泡排序,甚至不值得改进。 我只是直接回答,不想重复以上是关于在C ++中对字符向量进行排序并将大写字母和小写字母视为相同的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何像 EXCEL 一样在 Oracle 中对带有“_”的文本进行排序?