重新排列数组元素

时间:2016-05-03 22:43:12

标签: c++ arrays vector

我有一个点矢量。例如

{(1, 5), (3, 2), (1, 8)} 

C ++是否提供标准方法,以便我可以重新排列数组的元素,以便我可以选择(x0, y0)并重新排列向量,以便(x0, y0)位于数组的中间,数组的前半部分包含(xi, yi)xi < x0xi==x0的元素yi < y0,数组的后半部分包含其余元素。

我正在尝试使用std::swap调用来实现此功能,但我想知道是否有一种标准方法可以执行此类操作。

2 个答案:

答案 0 :(得分:1)

您可以使用std::partition来完成任务。

以下示例与使用std::partition的{​​{3}}上的示例相似:

struct Point {
    Point(int ix, int iy)
    : x{ix}, y{iy} {} 
    int x;
    int y;
};

int main()
{
    vector<Point> vec { Point(1, 5), Point(3, 2), Point(1, 8), Point(2, 3), 
                        Point(1, 3) };
    const Point middle(2, 0);

    cout << "Original vector:\n";
    for (Point i : vec)
        cout << i.x << "," << i.y << " ";

    auto it = partition(begin(vec), end(vec), [&middle](Point i) {
        return i.x < middle.x && i.y >= middle.y;
    });

    cout << "\nPartitioned vector:\n";
    for (auto beg = begin(vec); beg != it; ++beg) {
        cout << beg->x << "," << beg->y << " ";
    } // First half

    cout << "| ";
    for (; it != end(vec); ++it) {
        cout << it->x << "," << it->y << " ";
    } // Second half
}

这给出了输出:

Original vector:
1,5 3,2 1,8 2,3 1,3 
Partitioned vector:
1,5 1,3 1,8 | 2,3 3,2

答案 1 :(得分:0)

如果你想找到中位数,并根据它进行分区,你可以使用std::nth_element,其矢量大小的一半为n

如果你想选择一个点,并将向量分割成分区(不一定是一半,除非你碰巧选择中位数),一方面包含较小的一方,另一方面大于或等于另一方,请使用{ {1}}

  

我如何让中间元素位于中间,而不仅仅是在数组的前半部分?

将目标点交换到向量的前面(如果等于在较大的一侧;在相反的情况下,交换到结束),然后使用std::partition而不是常规分区。然后,所选择的点将最终位于分区的边界。