Скажем, у меня есть строка, содержащая числа, разделенные пробелами. Я хочу вставить числа в вектор целых чисел, где каждое число уменьшается на единицу. Так, например:
"1 2 3 4" -> {0, 1, 2, 3}
Теперь план должен был использовать std::transform
в сочетании с std::istream_iterator<int>
, который выглядит следующим образом:
std::istringstream source{"1 2 3 4"};
std::vector<int> target;
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::begin(target),
[](int a) {
return a-1;
}
);
К сожалению, это не работает, потому что std::transform
надеется target
уже быть подходящего размера. Так что я должен сделать
std::vector<int> target(4);
Теперь у меня есть два вопроса. Как я могу динамически найти правильный размер для target
заранее? Есть ли более элегантный способ достижения реальной цели?
Исследуя этот вопрос, я нашел простое решение. Просто использовать std::back_inserter
в качестве выходного итератора вместо std::begin(target)
,
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::back_inserter(target),
[](int a) {
return a-1;
}
);
Другая решение использования std::for_each
:
std::for_each(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
[&target](int a) {
target.push_back(a-1);
}
);
Других решений пока нет …