В Visual C ++ 2008 нет, это примерно так "элегантно", как кажется. Стандартная библиотека предоставляет алгоритмы, которые можно использовать для манипулирования контейнерами, но в большинстве сценариев - особенно в простых случаях использования, таких как этот, - они слишком громоздки для использования.
C ++ 11 добавляет лямбда-выражения в C ++. Visual C ++ 2010 и последние версии других компиляторов C ++ поддерживают эту функцию C ++ 11. С лямбда-выражениями вы можете легко использовать алгоритм transform
для вашей задачи:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
[](Foo const& x) { return x.b; });
Без лямбда-выражений вам нужно определить функцию для извлечения элемента b
из структуры:
long get_b(Foo const& x) { return x.b; }
Затем вы можете использовать эту функцию с алгоритмом transform
:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);
Однако для таких простых случаев использования, как этот, это может быстро привести к громоздкому коду, поскольку трудно аккуратно хранить все связанные функции вместе.