如何在地图c ++中使用复数

时间:2014-04-03 17:30:54

标签: c++

我已经坐了好几个小时,试图找到一种在std :: map中使用复杂值的方法。我的代码是

std::vector<std::complex<double>> coord; // bin coordinates
std::vector<std::string> ref; //A1,D4,...
std::map<std::string,std::complex<double>> bin; //coordinates and reference
std::string letter_ref[] = {"H","G","F","E","D","C","B","A"};
std::string int_ref[] = {"1","2","3","4","5","6","7","8"};
double x=0;
double y=0;
for(int i=0;i<8;++i){
    for(int j=0;j<8;++j){
        coord.push_back(std::complex<double>(7-i,j));
        ref.push_back(letter_ref[i]+int_ref[j]);
        bin.insert(std::pair<std::string,std::complex<double>>(letter_ref[i]+int_ref[j], (7-i,j)));
        //bin.insert(std::pair<std::string,std::complex<double>>(letter_ref[i]+int_ref[j], (7-x,y)));
        ++y;
    }
    ++x;
}

这是构造函数的一部分。我有一个地图和两个应该显示相同的向量的原因是因为我开始使用向量,但发现它是一个痛苦的工作。但是我想让旧矢量保持更长时间才能使地图正确。

但是地图没有给出预期的结果。使用

打印地图
std::map<std::string,std::complex<double>>::iterator it;
int i = 0;
for(it=bin.begin();it!=bin.end();++it){
    std::cout<<"["<<it->first<<","<<it->second<<"] ";
    if ((i+1) % 8 == 0)// & i>0)
        std::cout<<"\n";
    ++i;
}

在第一种情况下(未注释)是否显示虚部为0,但第一部分是正确的。第二种情况(注释)仍显示虚部的0值,但实部确实给出值0-63而不是给出值0-63。

有谁知道如何在地图中正确使用复数?

1 个答案:

答案 0 :(得分:3)

在c&#t;中,您希望在地图中存储一个复数,包含实部7-i和虚部j。您可以通过传递(7-i, j)来执行此操作,但这不会按照您期望的方式调用std::complex<double>的句子(即使用re=7-iim=j)。< / p>

您在代码中实际使用的是comma operator。来自维基百科:

  

在C和C ++编程语言中,使用逗号运算符   (由标记表示)是一个二进制运算符,用于计算它   第一个操作数并丢弃结果,然后计算第二个操作数   操作数并返回此值(和类型)。

通过将(7-i, j)传递给std::complex<double>的c&#39;而不是创建包含实部7-i和虚部j的虚数,您可以创建一个复数实数j的数字,没有虚部。所以只需替换你的行

bin.insert(std::pair<std::string,std::complex<double>>(letter_ref[i]+int_ref[j], (7-i,j)));

bin.insert(std::pair<std::string,std::complex<double>>(letter_ref[i]+int_ref[j], std::complex<double>(7-i,j)));

使其按预期工作。这明确地使用您指定的参数调用std::complex<double>的c。