从向量中提取最低复数

时间:2011-12-01 10:03:03

标签: c++ vector

矢量将点指向矩形。我希望能够获得最低和最高的复数,并将其分配给2个不同的复数。我只尝试过以下的最低价,但它似乎没有找到最低价,只是返回第一个元素。

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
   {
   }
} 

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

代码中的直接错误是*p+1表示(*p)+1

将其修复为*(p+1)之后的下一个错误就是你从向量的末尾开始了一个元素。您应该将每个值与目前为止的最低/最高值进行比较,而不是与向量中的下一个值进行比较。

在任何情况下都没有“最低”或“最高”的复数 - 复数不是有序域(定理)。您可以在复数上定义您喜欢的任何比较运算符,但它将非常随意,例如它不一定具有有序的字段属性,例如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在排序方面并不相同。

答案 1 :(得分:0)

在循环中,您不能与最低数字进行比较,只能与下一个数字进行比较。尝试这样的事情:

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()在最后一项上将是{{1}},并且这将不是有效指针。

答案 2 :(得分:0)

使用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|
    });