在向量c ++中对复数进行排序

时间:2015-01-28 00:56:35

标签: c++ sorting vector complex-numbers

我是c ++和编程的新手,我试图将用户输入的复数输入单独的行,直到用户点击ctr-d。我的逻辑是否正确?我知道我有很多错误。提前致谢

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

2 个答案:

答案 0 :(得分: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>);

但是,我不太确定你想要实现的目标,因为没有任何意义可以说一个复数比另一个复数“更大”。

答案 1 :(得分: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;
}