这是一个很好的练习,尝试编写通用的“join”代码。下面的代码接受一个嵌套容器“R1 < R2 < T >”,并返回一个已连接的容器“R1 < T >”。请注意,由于标准库中的分配器参数,这有点麻烦。没有尝试检查分配器的兼容性等问题。
幸运的是,在即将发布的Eric Niebler的range-v3库中有一个名为“action :: join”的函数,它已经非常健壮,并且在Clang上可以使用。
#include <range/v3/all.hpp>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
template<template<class, class...> class R1, template<class, class...> class R2, class T, class... A1, class... A2>
auto join(R1<R2<T, A2...>, A1...> const& outer)
{
R1<T, A2...> joined;
joined.reserve(std::accumulate(outer.begin(), outer.end(), std::size_t{}, [](auto size, auto const& inner) {
return size + inner.size();
}));
for (auto const& inner : outer)
joined.insert(joined.end(), inner.begin(), inner.end());
return joined;
}
int main()
{
std::vector<std::vector<int>> v = { { 1, 2 }, { 3, 4 } };
std::vector<int> w = join(v);
std::copy(w.begin(), w.end(), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
std::vector<int> u = ranges::action::join(v);
std::copy(u.begin(), u.end(), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
}
实时示例
vector_of_T.reserve(std::accumulate(std::begin(vector_of_vectors_of_T), std::end(vector_of_vectors_of_T), 0, [](size_t size, std::vector<T> const& vec) { return size + vec.size(); }));
。 - LogicStuff