我有一个点矢量。例如
{(1, 5), (3, 2), (1, 8)}
C ++是否提供标准方法,以便我可以重新排列数组的元素,以便我可以选择(x0, y0)
并重新排列向量,以便(x0, y0)
位于数组的中间,数组的前半部分包含(xi, yi)
或xi < x0
和xi==x0
的元素yi < y0
,数组的后半部分包含其余元素。
我正在尝试使用std::swap
调用来实现此功能,但我想知道是否有一种标准方法可以执行此类操作。
答案 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
而不是常规分区。然后,所选择的点将最终位于分区的边界。