Мой вопрос прост, смотри пример:создать контейнер из другого контейнера, применяя каждый элемент некоторой функции в C++
std::array<int,6> a = {{0,1,2,3,4,5}}; // -- given container.
auto F = [](int i) { return i*i; }; // -- given function.
std::vector<int> v; // need create
// my solution:
v.reserve(a.size());
for(std::size_t i = 0; i < a.size(); ++i)
v.push_back(F(a[i]));
// but I need something like
std::vector<int>v(a.begin(), a.end(), <|applying each element to F|>);
Могу ли я создать что-то вроде контейнера выше, не вызывая резерв явно и любое перераспределение?
EDIT:
- Я хочу, чтобы избежать резерва; потому что othercase мое первое решение хорошее для меня :)
- Я хочу избежать изменения размера; потому что он инициализировал каждый элемент по умолчанию ctor.
- Я буду использовать это в реальном проекте, который может включать в себя множество 3-х партийных библиотек (boost, Soft-STL, ...).
Будет 'станд :: transform' не делать это? –
['Инициаторы преобразования] (http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/transform_iterator.html) могут быть полезны здесь. – Borgleader
Я хочу также избегать v.reserve (a.size()). – Khurshid