排序范围-v3压缩容器-我可以解压缩吗?



是否可以使用c++ Range-v3库解压缩以前压缩的向量?我希望它的行为类似于Haskell的unzip函数或Python的zip(*list)。

例如,当按另一个向量的值对一个向量排序时,它将很方便:

using namespace ranges;
std::vector<std::string> names {"john", "bob", "alice"};
std::vector<int>         ages  {32,     19,    35};
// zip names and ages
auto zipped = view::zip(names, ages);
// sort the zip by age
sort(zipped, [](auto &&a, auto &&b) {
  return std::get<1>(a) < std::get<1>(b);
});
// put the sorted names back into the original vector
std::tie(names, std::ignore) = unzip(zipped);

当传递容器参数时,range-v3中的view::zip创建一个由原始元素引用的元组组成的视图。将压缩视图传递给sort对元素进行排序。例如,这个程序:

#include <vector>
#include <string>
#include <iostream>
#include <range/v3/algorithm.hpp>
#include <range/v3/view.hpp>
using namespace ranges;
template <std::size_t N>
struct get_n {
  template <typename T>
  auto operator()(T&& t) const ->
    decltype(std::get<N>(std::forward<T>(t))) {
      return std::get<N>(std::forward<T>(t));
  }
};
namespace ranges {
template <class T, class U>
std::ostream& operator << (std::ostream& os, common_pair<T, U> const& p) {
  return os << '(' << p.first << ", " << p.second << ')';
}
}
int main() {
  std::vector<std::string> names {"john", "bob", "alice"};
  std::vector<int>         ages  {32,     19,    35};
  auto zipped = view::zip(names, ages);
  std::cout << "Before: Names: " << view::all(names) << 'n'
            << "         Ages: " << view::all(ages) << 'n'
            << "       Zipped: " << zipped << 'n';
  sort(zipped, less{}, get_n<1>{});
  std::cout << " After: Names: " << view::all(names) << 'n'
            << "         Ages: " << view::all(ages) << 'n'
            << "       Zipped: " << zipped << 'n';
}

输出:<>之前名字:[约翰,鲍勃,爱丽丝]年龄(32岁,19岁,35):拉链:[(约翰,32),(鲍勃,19),(爱丽丝,35)]人名:[鲍勃,约翰,爱丽丝]年龄(19,32岁,35):拉链:[(鲍勃,19),(约翰,32),(爱丽丝,35)]之前

Coliru示例.

相关内容

  • 没有找到相关文章