【问题标题】:Sorting several vectors in synch同步排序多个向量
【发布时间】:2020-05-20 07:09:53
【问题描述】:

假设我想根据向量 A 以升序对向量 A、B 和 C 进行排序,使得向量 B 和 C 会相应变化。如果向量A包含两个或多个相同的元素,则优先考虑对应向量C上较大的值。举个例子。

A=25,10,10,5,5

B=12,14,3,45,6

C=123,23,12,45,76

排序后是这样的

A=5,5,10,10,15

B=6,45,14,3,12

C=76,45,23,12,123

谁能告诉我如何为此编写一个 c++ 程序?可以使用哪个库?

【问题讨论】:

  • A=25,10,10,5,5 -- 如果105 不在连续位置怎么办?您如何知道排序标准中使用了哪个10 或哪个5
  • 一般来说,当我看到关于排序一个容器的问题,以及根据该排序更改第二个(或第三个!)容器的排序时,通常表明您需要一个复杂的容器数据类型,例如 std::vector<my_struct>std::vector<std::tuple<int, int, int>>
  • @PaulMcKenzie 然后我们可以检查 C 的相应值。这意味着向量 A 的第二个元素链接到向量 B 和 C 的第二个元素。类似地,向量 B 的第三个元素与向量 B 和 C 的第三个元素相关
  • 谁能帮助我理解我的例子并用c++程序证明它?
  • 哪一部分你不明白?制作自定义数据类型,或根据您规定的规则对该数据类型进行排序?我提出的方法需要一个结构和一个自定义比较操作。

标签: c++ algorithm sorting vector


【解决方案1】:

使用range-v3,您可以使用zip 视图:

std::vector A = {25,10,10,5,5};
std::vector B = {12,14,3,45,6};
std::vector C = {123,23,12,45,76};
auto r = ranges::view::zip(A, B, C);
ranges::sort(r,
             std::less<>{},
             [](const auto& tup){
                 return std::make_tuple(std::get<0>(tup), -std::get<2>(tup));
             });

Demo

(您可以创建自定义比较器,而不是使用投影和否定 C 值“作弊”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2019-06-15
    • 2014-07-08
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多