重新排列数组的元素

Rearrange elements of array

本文关键字:数组 元素 排列 新排列      更新时间:2023-10-16

我有一个点的向量。例如

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

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

我正试图使用std::swap调用来实现这一点,但我想知道是否有一种标准的方法来做这类事情。

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

下面是一个类似于使用std::partition:的cppresence的示例

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

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

如果要拾取一个点,并将矢量拆分为一边包含较小值,另一边包含较大值或相等值的分区(不一定是两半,除非您碰巧拾取了中值),请使用std::partition

如何使中间元素位于数组的中间,而不是简单地位于数组的前半部分?

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