从向量中提取最低复数

Extracting lowest complex number from a vector

本文关键字:提取 向量      更新时间:2023-10-16

向量指向一个矩形。我想把最小和最大的复数赋值给两个不同的复数。我只尝试了下面的最低,但它似乎没有找到最低,只是返回第一个元素。

vector < complex<double>* > xs;
typedef typename vector < complex<double>* >::iterator Iter;
xs.push_back(&pointa); 
xs.push_back(&pointb); 
xs.push_back(&pointc); 
xs.push_back(&pointd); 
for (Iter p = xs.begin(); p != xs.end(); ++p)
{
   if((*p)->real()<(*p+1)->real() && (*p)->imag()<(*p+1)->imag())
   {
      double a = (*p)->real();
      double b = (*p)->imag();
      complex <double> botleft_1(a,b);
   }
   else
   {
   }
} 

有什么建议吗?

代码中的直接错误是*p+1意味着(*p)+1

修复*(p+1)后的下一个错误将是您从向量的末端移出一个元素。您应该将每个值与vector中到目前为止的最低/最高值进行比较,而不是与vector中的下一个值进行比较。

在任何情况下都不存在"最低"或"最高"的复数——复数不是有序域(定理)。您可以在复数上定义任何比较运算符,但它将是相当任意的,例如,它不一定具有有序的字段属性,如a < b && c < d => a+c < b+d。您所定义的比较确实具有该属性,但不是严格的弱顺序,因此一旦开始在3个或更多值之间进行比较,它可能不会按照您期望的方式运行。

例如,考虑值complex<double> a(1,1), b(0,3), c(2,2);和比较函数lt(complex<double> lhs, complex<double> rhs) { return lhs.real() < rhs.real() && lhs.imag() < rhs.imag(); }

lt(a,b)lt(b,a)均为假。这意味着ab在排序上是等价的。

同理,lt(b,c)lt(c,b)都为假。这意味着bc在排序上是等价的。

然而,lt(a,c)是正确的。这意味着就排序而言,ac是不相等的。

在循环中不与最小的数字比较,只与下一个数字比较。试试这样做:

complex<double> *lowest = *xs.begin();
for (Iter p = xs.begin() + 1; p != xs.end(); ++p){
    if ((*p)->real() < lowest->real() && (*p)->imag() < lowest->imag())
        lowest = *p;
}

循环结束后,变量lowest必须是您想要的。

同样,在你的循环版本中,你比较p + 1,最后一项将是xs.end(),这将不是一个有效的指针。

使用boost::minmax_element

std::pair< Iter > pairit = boost::minmax_element( xs.begin(), xs.end(), 
    [&]( complex<double>* pcomplexA, complex<double>* pcomplexB ) {
         //  Suitable comparison predicate (see Steve Jessop's answer)
         return pcomplexA->abs() < pcomplexB->abs(); // |a| < |b|
    });