排序字符向量并在C ++中将大写和小写字母视为相等的最佳方法?

时间:2016-09-08 19:39:14

标签: c++ sorting vector

我目前拥有的是:

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}。实现这一目标的最佳方法是什么?我想一种方法是将大写或小写字母的所有值重置为彼此相等。

3 个答案:

答案 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;
    }
}

Live demo

答案 2 :(得分:1)

虽然其他人在他们的回答中提出了std::sort,但我会建议使用您的算法解决方案,就像这样。 (您需要std::tolowerstd::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;
}