2015-01-28 2 views
1

Im новое для C++ и программирования, и я пытаюсь ввести сложные числа, введенные пользователем на отдельных строках, пока пользователь не нажмет ctr-d. Моя логика на правильном пути? Я знаю, что у меня много ошибок. Заранее спасибоСортировка комплексных чисел в векторе C++

main(){ 
    vector <complex<double> > vector; 
    double cmplx; 
    while (!cin.eof()){ 
    cout << "Enter a complex number or ctr-d to stop" << endl; 
    cin >> cmplx; 
    vector.push_back(cmplx); 
    } 
    sort(vector.begin(),vector.end()); 
    for (int x = 0; x < vector.size(); x++) 
    cout << vector[x] << endl; 
} 
+4

Вы делаете cin >> cmplx, но cmplx - это двойной не комплексный номер. Не называйте свой векторный вектор, даже если он работает смущает – pm100

+3

Сортировка сложных чисел? Не так просто, потому что для них нет определенного порядка. – kratenko

ответ

3

std::sort не имеет встроенную функцию для сортировки комплексных чисел, так что вы должны написать свою собственную функцию компаратора и передать его в качестве аргумента в sort() как

sort(vector.begin(),vector.end(),myWay); 

myWay функция определяется как

bool myWay(complex<double> a, complex<double> b) 
{ 
    if (real(a) == real(b)) 
     return imag(a) < imag(b); 
    return real(a) < real(b); 
} 

Итак, вся ваша гр ода должна выглядеть говорить

bool myWay(complex<double> a, complex<double> b) 
{ 
    if (real(a) == real(b)) //If real parts are equal 
     return imag(a) < imag(b); //Sort by imaginary parts 
    return real(a) < real(b); //If not, well, sort by real parts 
} 
main(){ 
    vector <complex<double> > vec; //Changed name from vector 
    complex<double> cmplx; 
    while (cin >> cmplx) //Use this to detect EOF 
{ 
    cout << "Enter a complex number or ctrl-d to stop" << endl; 
    vec.push_back(cmplx); 
} 
    sort(vec.begin(),vec.end(),myWay); 
    for (int x = 0; x < vec.size(); x++) 
    cout << vec[x] << endl; 
} 
+0

это не затрагивает (чрезвычайно важные) проблемы неправильного использования eof и неуклюжее имя столкновения 'vector'. Кроме того, неверно говорить, что вы «вызываете» функцию компаратора в сортировке. Вы этого не делаете - вы просто передаете его, чтобы сортировать, и он будет вызван, когда это уместно. –

+0

Извините, я отредактирую эту часть. Спасибо за изменения. :) – shauryachats

+1

Спасибо за помощь! – user3602550

6

Математически, нет заказа определяется для комплексных чисел, поэтому нет operator< определена для complex. Вы можете попробовать изобрести свою собственную функцию заказа (например, заказав их лексикографически), но это требует написания собственной функции компаратора:

template <class T> 
bool complex_comparator(const complex<T> &lhs, const complex<T> &rhs) { 
return real(a) == real(b) ? imag(a) < imag(b) : real(a) < real(b); 
} 

и затем вызывая то вроде этого:

sort(v.begin(), v.end(), complex_comparator<double>);

Однако я «Не совсем уверен, чего вы пытаетесь достичь, потому что нет смысла говорить, что одно комплексное число« больше », чем другое.

Смежные вопросы