对向量 C++ 中的复数进行排序
Sorting complex numbers in a vector c++
我是 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;
}
std::sort
没有用于对复数进行排序的内置函数,因此您必须编写自己的 comparator 函数并将其作为参数传递给 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;
}
从数学上讲,没有为复数定义排序,这就是没有为 complex
定义的 operator<
的原因。您可以尝试发明自己的排序函数(例如按字典顺序排序)但这需要编写自己的比较器函数:
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>);
但是,我不太确定您要实现的目标是什么,因为说一个复数 "bigger" 比另一个复数没有意义。
我是 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;
}
std::sort
没有用于对复数进行排序的内置函数,因此您必须编写自己的 comparator 函数并将其作为参数传递给 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;
}
从数学上讲,没有为复数定义排序,这就是没有为 complex
定义的 operator<
的原因。您可以尝试发明自己的排序函数(例如按字典顺序排序)但这需要编写自己的比较器函数:
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>);
但是,我不太确定您要实现的目标是什么,因为说一个复数 "bigger" 比另一个复数没有意义。