Копирование строки в набор <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;
}