【问题标题】:Any alternative for pairs?有没有成对的替代品?
【发布时间】:2015-03-11 00:03:54
【问题描述】:

我有很多点 (a,b),我将 x 坐标存储在 a[] 中,将 y 坐标存储在 b[] 中。现在我需要对这些点进行 x 坐标或 y 坐标的排序。我知道 C++ 中有对的概念,但是有没有更好的方法来做到这一点。请用 C/C++ 给出答案。

【问题讨论】:

  • 我想不出更好的方法来存储两个整数对,然后存储在一个两个整数对的结构中。
  • 您是在询问 C 还是 C++,还是想要两者都适用的东西?
  • 您可以为a 创建一个自定义迭代器,这样当您sort 它时,它还会修改b 中的顺序以保持一致。

标签: c++ c functional-programming


【解决方案1】:
struct vertex
{
int x;
int y;
};

然后对结构进行相应的排序。

【讨论】:

  • 能否请您详细说明如何使用 C++ 的 sort() 函数对这些结构的数组进行排序
  • @user3901994 std::sort(std::begin(an_array), std::end(an_array), [] (vertex const &amp; a, vertex const &amp; b) { return a.x &lt; b.x; }); a.x < b.x 替换为a.y &lt; b.y 以按y 字段而不是x 字段排序。
  • @cdhowie 我认为指出您的比较器使用 lambda 函数并且需要 C++11 标志来编译是有帮助的。
【解决方案2】:

您可以使用struct,正如其他答案中指出的那样。但是,如果您定义自己的结构,则需要定义一个比较器函数以用于排序算法或重载 &lt; 运算符。

使用std::pair 的优点是您不需要定义比较器,因为std::pair 重载了运算符&lt;,以首先按第一个元素排序,然后是第二个元素。 有关示例,请参阅此 answer

【讨论】:

  • *"std::pair is that you won't need to define a comparator"* - that's certainly worthy of mention but only works for increasing order of .first`...
【解决方案3】:

您可以使用std::pair&lt;int, int&gt; 存储这对坐标,或者如@Gopi 的回答所指示的struct

可以使用 lambda 函数、仿函数或全局函数按 X 坐标或 Y 坐标对其中任何一个的集合进行排序。

// A vector of vertices.
std::vector<std::pair<int, int>> vertices;

// Sort the vertices by X coordinates using a lambda function to order them
std::sort(vertices.begin(), vertices.end(),
         [](auto const& a, auto const& b) { return a.first < b.first; });

// Sort the vertices by Y coordinates using a lambda function to order them
std::sort(vertices.begin(), vertices.end(),
          [](auto const& a, auto const& b) { return a.second < b.second; });

【讨论】:

  • pair 已经有一个比较函数,它比较 first,如果它们相等,它比较 second 所以你不需要将 lambda 传递给那里的第一个排序。跨度>
  • @JonathanMee,真的。如果用户只想按 X 坐标对它们进行排序而忽略 Y 坐标,则需要使用比较功能。
【解决方案4】:

最好的方法是 struct 作为@Gopi 的答案。对于字典排序,您可以使用 std::tie (http://en.cppreference.com/w/cpp/utility/tuple/tie)。

struct vertex
{
    int x;
    int y;
    bool less_x(const struct vertex& b) const { return std::tie(x,y) < std::tie(b.x, b.y); }
    bool less_y(const struct vertex& b) const { return std::tie(y,x) < std::tie(b.y, b.x); }
};

【讨论】:

    【解决方案5】:
    int c = x*n + y    where, n>x and n>y 
    
    x=c/n 
    y=c%n
    

    当您需要 x 时,只需 c/n 将提供 x,而对于 y,使用 c%n 将提供 y。

    注意:仅适用于正坐标

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多