一般join
を試してみてください。以下のコードは入れ子になったコンテナR1<R2<T>
を受け取り、結合されたコンテナを返します。標準ライブラリのアロケータパラメータのため、これは少し面倒です。などアロケータの互換性を確認するために行われている試み
は幸いなことに、action::join
機能は、エリックNieblerによって、今後の範囲-V3ライブラリにありません、それはすでにかなり堅牢で、クランに今日働く:
#include <range/v3/all.hpp>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
// quick prototype
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 } };
// quick prototype
std::vector<int> w = join(v);
std::copy(w.begin(), w.end(), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
// Eric Niebler's range-v3
std::vector<int> u = ranges::action::join(v);
std::copy(u.begin(), u.end(), std::ostream_iterator<int>(std::cout, ",")); std::cout << "\n";
}
Live Example
私が求めていますので、私はこの質問は私が尋ねる前に、このことについて疑問を持っていた – Default
@Luca Pizzamiglioの感謝のためのより良いフィットすると思います..しかし、それを行うstdの方法。それはここにも当てはまるかもしれません... –
@defaultをcorrecingためhttp://codereview.stackexchange.com/ –