2011-12-01 6 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)은 모두 false입니다. 즉, 주문과 관련하여 ab은 동일한 의미입니다.

마찬가지로, lt(b,c)lt(c,b)은 모두 거짓입니다. 즉, 주문과 관련하여 bc은 동일한 의미입니다.

그러나 lt(a,c)은 true입니다. 즉, 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| 
    });