Извлечение наименьшего комплексного числа из вектора - PullRequest
0 голосов
/ 01 декабря 2011

Вектор принимает точки к прямоугольнику.Я хочу иметь возможность взять самый низкий и самый высокий комплексное число и назначить его двум различным комплексным числам.Я пробовал только самое низкое из приведенного ниже, но, похоже, оно не находит самое низкое и просто возвращает 1-й элемент.

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 ]

4 голосов
/ 01 декабря 2011

Непосредственная ошибка в вашем коде заключается в том, что *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 не являются эквивалентными в том, что касается порядка.

0 голосов
/ 01 декабря 2011

Использование повышение :: 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|
    });
0 голосов
/ 01 декабря 2011

В цикле вы не сравниваете с наименьшим номером, только со следующим номером.Попробуйте что-то вроде этого:

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() на последнем элементе, и это не будет действительный указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...