std :: transform с помощью std :: istream_iterator

Скажем, у меня есть строка, содержащая числа, разделенные пробелами. Я хочу вставить числа в вектор целых чисел, где каждое число уменьшается на единицу. Так, например:

"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 заранее? Есть ли более элегантный способ достижения реальной цели?

1

Решение

Исследуя этот вопрос, я нашел простое решение. Просто использовать 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);
}
);
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector