在向量中排序更高和更低的值

时间:2013-06-09 08:18:31

标签: c++ sorting vector struct

我有一个包含4个未排序元素的向量,向量看起来像这样:

vector<positionInfo> objects

其中positionInfo是一个结构:

struct positionInfo
{
  int X_pos;
  int Y_pos;
}

现在,这4个元素没有排序,但我希望它们按特定顺序排列,即:

  • 元素1([0])必须具有最低的Y和X位置。
  • 元素2([1])必须具有最高的X pos但最低的Y pos。
  • 元素3([2])必须具有最高的Y和X位置。
  • 元素4([3])必须具有最低的X pos但是最高的Y pos。

这只是为了轻松访问构成立方体的4个点中的任何一个,使用很多变量可能会得到我想要的但是我认为这不是最优的,是否有我可以用来减小尺寸的算法代码并提高速度?

3 个答案:

答案 0 :(得分:2)

如果您完全确定自己有解决方案,则可以部分使用std::sort

例如(3个步骤):

重载<运算符:

bool
operator < (const positionInfo & left, const positionInfo & right)
{
    return left.X + left.Y < right.X + right.Y;
}

接下来,对你的矢量进行排序:

std::sort( &objects[0], &objects[4] );

注意,在这个例子中,vector有4个元素。

因此,您将获得一个向量,其中第一个和最后一个元素根据您的意愿进行排序。

最后一步 - 如果需要,交换内部元素:

if ( objects[1].X < objects[2].X )
    std::swap( &objects[1], &objects[2] );

完成。

答案 1 :(得分:0)

您的条件不是本地数据。如果一个元素比另一个元素更大或更小,您应该有关于要计算的所有元素的信息。

我用图片来说明这一点:

enter image description here

仅考虑(1)和(2)或(3)和(4),不可能说,什么应该更大:

如果(1)和(2)的 y 坐标大于(3)和(4),他们会交换他们的位置。

然而,通常的搜索算法只能在假设中使用,您可以比较本地元素,因此您可以选择两个元素中的哪一个更大,仅考虑2个元素。

因此您无法使用标准排序算法

相反,你应该制作新的矢量并根据条件用元素填充它:

new_objects[0] = find_elememt_with_lowet_x_and_y(objects);
new_objects[1] = find_element_with_highets_x_and_lowest_y(objects); 
//....
objects = new_objects;

答案 2 :(得分:0)

有几点:

  • 四个点不形成立方体 - 它有8个顶点。如果您的意思是确定一个立方体可能需要3个维度。我假设你说方形
  • 如果您实际上没有处理方块,但是随机4点,您的排序不明确 - Element 1 ( [0] ) must have the lowest Y and X pos例如,它不需要具有最低yx在同一点上。

但是,如果您的意思是方形,而不是立方体,并且确实想要处理这种情况,您可以通过以下方式进行操作

  • 循环所有四个顶点
  • 找到最小和最大xy s
  • 因为您确定您所处理的情况,您可以从这4个值中创建4个兴趣点。