Я бы не стал использовать один из алгоритмов, если у вас нет компилятора, который поддерживает лямбды. Это совершенно ясно, как написано. Даже если ваш компилятор поддерживает лямбды, я бы, вероятно, не изменил этот код.
Одним из относительно простых вариантов было бы написать уплощающий итератор. Я написал один для демонстрации в ответ на другой вопрос .
Если вы действительно хотите использовать однострочник и можете использовать bind
(boost::bind
от Boost, std::tr1::bind
от TR1 и std::bind
от C ++ 0x будут работать), тогда вот как это будет выглядеть. Заранее предупреждаю: это ужасно.
Редактировать: Технически это также незаконно. Тип функции-члена стандартной библиотеки не указан, поэтому вы не можете (переносимо или правильно) взять адрес такой функции-члена. Если бы вы могли правильно взять адрес функции-члена стандартной библиотеки, это выглядело бы так:
typedef std::vector<int>::iterator (std::vector<int>::*IteratorGetter)();
std::for_each(int_vectors.begin(), int_vectors.end(),
std::bind(
std::bind(
&std::vector<int>::insert<std::vector<int>::iterator>,
&ints,
std::bind((IteratorGetter)&std::vector<int>::end, &ints),
_1,
_2
),
std::bind((IteratorGetter)&std::vector<int>::begin, _1),
std::bind((IteratorGetter)&std::vector<int>::end, _1)
)
);
(Да, технически это одна «строка кода», так как это один оператор. Единственное, что я извлек - это typedef для типа указатель на член-функцию, используемый для устранения неоднозначности перегруженного begin
и end
функции; вам необязательно указывать это, но код требует горизонтальной прокрутки при переполнении стека, если я этого не сделаю.)