2011-12-01 94 views
0

矢量將點指向矩形。我希望能夠取最低和最高的複數,並將其分配給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

如何格式化你的代碼? –

+2

我想你需要澄清你的意思是「最低複數」。你如何希望比較兩個複數? | U | <| v |? – voltrevo

+0

爲了在數學上正確,不存在最低複數(它們不具有可比性)。你到底在找什麼?也許你想要的是模數最低的數字? –

回答

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(),並且這不會是有效的指針。

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不等同。

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