Sorting 分拣范围-v3-ZIP集装箱-我可以解压缩吗? 是否有可能使用C++来解压缩先前拉链的向量?我希望它的行为类似于Haskell的函数或Python的函数

Sorting 分拣范围-v3-ZIP集装箱-我可以解压缩吗? 是否有可能使用C++来解压缩先前拉链的向量?我希望它的行为类似于Haskell的函数或Python的函数,sorting,c++11,boost-range,range-v3,Sorting,C++11,Boost Range,Range V3,例如,当按另一个向量的值对向量进行排序时,这会很方便: 使用名称空间范围; 向量名{“约翰”、“鲍勃”、“爱丽丝”}; 病媒年龄{32,19,35}; //邮政编码姓名和年龄 自动压缩=视图::zip(姓名、年龄); //按年龄对拉链进行分类 排序(压缩,[](自动和a、自动和b){ 返回std::get(a) decltype(std::get(std::forward(t))){ 返回std::get(std::forward(t)); } }; 命名空间范围{ 模板 std::ostrea

例如,当按另一个向量的值对向量进行排序时,这会很方便:

使用名称空间范围;
向量名{“约翰”、“鲍勃”、“爱丽丝”};
病媒年龄{32,19,35};
//邮政编码姓名和年龄
自动压缩=视图::zip(姓名、年龄);
//按年龄对拉链进行分类
排序(压缩,[](自动和a、自动和b){
返回std::get(a)
当传递容器参数时,range-v3中的
视图::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';
}
#包括
#包括
#包括
#包括
#包括
使用名称空间范围;
模板
结构获取{
模板
自动运算符()(T&&T)常量->
decltype(std::get(std::forward(t))){
返回std::get(std::forward(t));
}
};
命名空间范围{
模板

std::ostream&operator函数的命名和名称空间向我建议,它不会创建新的数据结构。您确定它没有直接对名称和年龄数据结构进行操作吗?如果是,解压缩将是一个否定的选项-op@stefan你说得对!如果我总是有所有原始的压缩向量,为什么我需要解压呢ors!我只是被不可变的Haskell列表弄糊涂了。谢谢你,你能给我一个答案,这样我就可以把它标记正确吗?的确。比
解压更方便的是首先让
zip
做正确的事情。:-)谢谢,@Casey。我注意到有
范围::get
,找到了。但现在它只需要一个范围,如果
ranges::get
也可以像上面的
get\n
那样接受元组,那就太好了。 Before: Names: [john,bob,alice] Ages: [32,19,35] Zipped: [(john, 32),(bob, 19),(alice, 35)] After: Names: [bob,john,alice] Ages: [19,32,35] Zipped: [(bob, 19),(john, 32),(alice, 35)]