我目前拥有的是:
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}。实现这一目标的最佳方法是什么?我想一种方法是将大写或小写字母的所有值重置为彼此相等。
答案 0 :(得分:5)
最好的方法是使用std::sort
中的<algorithm>
:
std::sort(v.begin(), v.end(), [](char i, char j){ return std::tolower(i) < std::tolower(j); });
其中v
是向量,std::tolower
可以在<cctype>
中找到。如果您无法访问C ++ 11 lambdas,则可以轻松替换它。
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
虽然其他人在他们的回答中提出了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;
}