矢量将点指向矩形。我希望能够获得最低和最高的复数,并将其分配给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
{
}
}
有什么建议吗?
答案 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)
都是假的。这意味着a
和b
就排序而言是等效的。
同样,lt(b,c)
和lt(c,b)
都是假的。这意味着b
和c
就排序而言是等效的。
然而,lt(a,c)
是真的。这意味着a
和c
在排序方面并不相同。
答案 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)
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|
});