Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对向量中的较高值和较低值进行排序_C++_Sorting_Vector_Struct - Fatal编程技术网

C++ 对向量中的较高值和较低值进行排序

C++ 对向量中的较高值和较低值进行排序,c++,sorting,vector,struct,C++,Sorting,Vector,Struct,我得到了一个包含4个未排序元素的向量,该向量如下所示: vector<positionInfo> objects 现在,这4个元素没有排序,但我希望它们按特定顺序排列,即: 元素1([0])必须具有最低的Y和X位置 元素2([1])必须具有最高的X位置,但具有最低的Y位置 元素3([2])必须具有最高的Y和X位置 元素4([3])必须具有最低的X位置,但具有最高的Y位置 这只是为了方便地访问构成立方体的4个点中的任何一个,使用大量变量可能会得到我想要的,但这并不是真正的最优,我

我得到了一个包含4个未排序元素的向量,该向量如下所示:

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

  • 元素1([0])必须具有最低的Y和X位置
  • 元素2([1])必须具有最高的X位置,但具有最低的Y位置
  • 元素3([2])必须具有最高的Y和X位置
  • 元素4([3])必须具有最低的X位置,但具有最高的Y位置
这只是为了方便地访问构成立方体的4个点中的任何一个,使用大量变量可能会得到我想要的,但这并不是真正的最优,我想,有什么算法可以用来减少代码的大小并提高速度吗?

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

我将用图片来说明这一点:

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

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

然而,通常的搜索算法只能在假设下工作,即您可以在本地比较元素,这样您就可以决定两个元素中哪一个更大,只考虑两个元素

因此,不能使用标准排序算法

相反,您应该根据以下条件创建新向量并用元素填充:

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;
有几点:

  • 四个点不构成立方体-它有8个顶点。如果你想确定一个立方体,你可能需要3维。我想你说的是正方形
  • 如果您实际上不是在处理正方形,但使用随机4点,您的排序不清楚-
    元素1([0])必须具有最低的Y和X位置
    ,例如,不要求在同一点上具有最低的
    Y
    X
但是,如果您的意思是正方形,而不是立方体,并且确实确定要处理这种情况,则可以按照以下方法进行处理

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

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

例如(3个步骤):


重载
你的问题有点模棱两可-最低的Y和X位置到底意味着什么?(例如,如果我有(1,10)和(7,2),最低的Y和X位置问题的答案是什么?)答案是否可以是不在向量中的点,
对象
?不,仅使用4个元素,它们决定最低的X和Y位置,很明显,结构中的Y_pos和X_pos的值是4中最小的。那么,如果我的四个输入是(1,10),(7,2),(12,0),(10,1),你希望你的四个答案是什么?
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;
bool
operator < (const positionInfo & left, const positionInfo & right)
{
    return left.X + left.Y < right.X + right.Y;
}
std::sort( &objects[0], &objects[4] );
if ( objects[1].X < objects[2].X )
    std::swap( &objects[1], &objects[2] );