Я читаю в пользовательский ввод через
string word;
while(cin >> myWord)
//put myWord in array
но ради сортировки я хочу, чтобы «это» и «это» были одинаковыми. Для моего алгоритма сортировки я использую значение по умолчанию < и> значения для строки, так что This! = 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: есть более сложные подходы, такие как использование пользовательских черт характера, но это делает это, и это легко понять. Если вы действительно любопытны, можете взглянуть здесь: