任何读入并在同一步骤中小写的方法

any way to read in and make lower case in same step?

本文关键字:一步 方法 任何读      更新时间:2023-10-16

我正在通过以下方式读取用户输入

string word;
while(cin >> myWord)
    //put myWord in array

但为了排序,我希望"这个"和"这个"是相同的。对于我的排序算法,我使用默认的<和字符串的>值,所以 This != 这个,为了我的目的,我需要它 ==,所以我想在读入时立即将所有内容设为小写。从下半部分我看到我需要创建一个for循环来遍历单词并使其小写,因此我需要在将单词放入数组之前在 while 循环中执行此操作。但是我想知道我是否可以做任何技巧,将 cin 中的单词放入已经小写myWord(或在读入后立即将"myWord"小写)放在一行中,沿着cin >> myWord.lower的思路

std::for_each(myWord.begin(),myWord.end(),[] (char &c) {c=std::tolower(c);}); 

这就是我的做法,通过使用自定义排序谓词来std::string

#include <algorithm>
#include <iostream>
#include <locale>
#include <string>
struct SortNoCase // functor used to sort strings ignoring the case
{
    bool operator()(const std::string& lhs, const std::string& rhs) const
    {
        std::string lhs_lower, rhs_lower;
        std::transform(std::begin(lhs), std::end(lhs), 
            std::back_inserter(lhs_lower), ::tolower);
        std::transform(std::begin(rhs), std::end(rhs), 
            std::back_inserter(rhs_lower), ::tolower);
        return lhs_lower < rhs_lower;
    }
};

int main ()
{
    std::vector<std::string> vs{"Some", "strings", "THAT", "are", "UnSorted"};
    std::sort(std::begin(vs), std::end(vs), SortNoCase());
    for(auto&& elem: vs)
        std::cout << elem << " ";
    std::cout << std::endl;
}

PS:还有更复杂的方法,例如使用自定义字符特征,但这确实如此,而且很容易理解。如果你真的很好奇,可以看看这里:

https://stackoverflow.com/a/5319855/3093378

相关文章: