【问题标题】:C++ Sorting Multiple Dimensional Array by 2 ColumnsC ++按2列对多维数组进行排序
【发布时间】:2020-04-01 09:09:56
【问题描述】:

我有一个 3D 数组,其中保存了 3 列数字数据。 我想按升序对这个 Nx3 矩阵进行排序,按第一列,然后对于该列上的值相同的情况,我希望它们根据第二列进行排序。

例如: 如果第 1 列中有多个 min 元素,我想再按第二列对它们进行排序,再次按升序排列。 所以它看起来像这样:

[1, 2, 3]
[1, 3, 1]
[2, 4, 2]
[3, 5, 6]

等等

由于第1列有多个min元素“1”,所以对第1列的这些最小值,再按照第2列的值进行排序。

我知道这在 Python 的 Pandas 中是可能的,但是在 C++ 中有没有方便的方法来做到这一点?

【问题讨论】:

  • 编写一个自定义比较器来满足您的需求。例如,请参阅this question
  • 这是关于二维数组(其中第一个维度恰好是大小 3)还是我遗漏了什么?

标签: c++ sorting matrix multidimensional-array


【解决方案1】:

我会用比较器尝试标准算法std::sort() 这是特定于您的需求。
(https://en.cppreference.com/w/cpp/algorithm/sort)

/*
  g++ -std=c++17 -o prog prog.cpp \
      -pedantic -Wall -Wextra -Wconversion \
      -g -O0 -fsanitize=address,undefined
*/

#include <iostream>
#include <vector>
#include <algorithm>

struct Vec3
{
  int x, y, z;
};

int
main()
{
  auto v=std::vector<Vec3>{{3, 5, 6},
                           {2, 4, 2},
                           {1, 3, 1},
                           {1, 2, 3}};
  const auto show=
    [&]()
    {
      for(const auto &e: v)
      {
        std::cout << e.x << ' ' << e.y << ' ' << e.z << '\n';
      }
    };
  show();
  std::sort(begin(v), end(v),
    [&](const auto &lhs, const auto &rhs)
    {
      if(lhs.x<rhs.x) return true;
      if(lhs.x>rhs.x) return false;
      if(lhs.y<rhs.y) return true;
      if(lhs.y>rhs.y) return false;
      return lhs.z<rhs.z;
    });
  std::cout << "~~~~~~~~~~~~~~~~\n";
  show();
  return 0;
}

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2015-06-28
    • 2011-03-15
    • 2014-05-13
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多