Копирование строки в набор <string> в нижнем регистре?

У меня есть следующий небольшой и простой код:

      int main(int argc, char *argv[]) {
    std::vector<std::string> in;
    std::set<std::string> out;

    in.push_back("Hi");
    in.push_back("Dear");
    in.push_back("Buddy");

    for (const auto& item : in) {
***        std::transform(item.begin(),item.end(),item.begin(), ::tolower);
***        out.insert(item); 
    }    
    
    return 0;
}

Я хотел бы скопировать все элементы in в .

Однако с преобразованием в нижний регистр на месте, желательно без дополнительной временной переменной.

Итак, это необходимое содержание out в конце:

      hi
dear
buddy

Пожалуйста, обрати внимание, const auto& item исправлено, то есть я не могу удалить const требование (это часть более крупной библиотеки, здесь чрезмерно упрощено для демонстрации).

Как мне это сделать? (Если я удалю модификатор "const", он будет работать, но если изменения не разрешены на item, как я могу еще вставить элемент в набор, одновременно переведя его в нижний регистр?)

2 ответа

Обратите внимание, вам придется копировать - поскольку элементы в оригинале inконтейнер не может быть перемещен в outконтейнер. Код ниже делает копию каждого элемента ровно один раз.

      ...
in.push_back("Hi");
in.push_back("Dear");
in.push_back("Buddy");

std::transform(in.begin(), in.end(), std::inserter(out, out.end()),
               [] (std::string str) { boost::algorithm::to_lower(str); return str;}
              );    
return 0;

Вам нужна лямбда-функция с преобразованием, и у вас не должно быть константы, и ваши строки или преобразование не могут ее изменить.

      #include <algorithm>
#include <set>
#include <string>
#include <vector>

int main() 
{
    std::vector<std::string> in;
    std::set<std::string> out;

    in.push_back("Hi");
    in.push_back("Dear");
    in.push_back("Buddy");

    for (/*const*/ auto& item : in)  // you can't have a const & if your going to modify it.
    {
        std::transform(item.begin(), item.end(), item.begin(), [](const char c) 
        { 
            return static_cast<char>(::tolower(c)); 
        });

        out.insert(item);
    }

    return 0;
}
Другие вопросы по тегам