重新排列数组的元素
Rearrange elements of array
我有一个点的向量。例如
{(1, 5), (3, 2), (1, 8)}
C++是否提供了一种标准方法,以便我可以重新排列数组的元素,以便我选择(x0, y0)
并重新排列向量,以便(x0, y0)
位于数组的中间,数组的前半部分包含带有xi < x0
或xi==x0
和yi < 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
而不是常规分区。然后,所选的点将在分区的边界处结束。
相关文章:
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- Getter 和 Setter 用于类 C++ 中的数组元素
- 尝试递归获取数组元素的总和
- 使用SWIG将numpy数组元素(int)传递给c++int