2014-04-03 36 views
2

我一直坐幾個小時,試圖找到一種方法來在std :: map中使用複數值。我的代碼是如何在地圖中使用複數C++

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-7。

有誰知道如何在地圖中正確使用複數?

+2

請發佈[SSCCE](http://www.sscce.org/)。您的代碼引用了未聲明的變量。很難說出你實際想要做什麼以及出了什麼問題。 – japreiss

+0

上面'cb'實例指的是什麼? –

+0

opps我忘記了這一點。但下面的答案很清楚。 – patrik

回答

3

在c'tor你想存儲一個複雜的數字在你的地圖上的實部7-i和虛部j。您通過傳遞(7-i, j)來實現此目的,但這不會像您期望的那樣調用std::complex<double>的c'tor(即使用re=7-iim=j)。

你在代碼中實際使用的是comma operator。維基百科:

在C和C++編程語言中,逗號操作者 (令牌表示,)是評價其 第一個操作數和丟棄結果,然後計算所述第二 操作數的二進制運算符並返回這個值(和類型)。

通過傳遞(7-i, j)std::complex<double>的c'tor而不是創建與實部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'tor。

+0

如果沒有任何修改,原始發佈代碼會在我的RAD Studio - C++ Builder Win64編譯器上產生編譯器警告。警告在'bin.insert(...)'行中說:'表達式結果未使用'。如果不知道,3.1 LLVM(CLang ++)是64位Windows C++ Builder編譯器的基礎。 @patrik編譯器是否使用了類似的警告?這個答案在我的系統上編譯並運行時沒有警告。 –

+0

太好了,謝謝你的回答!我想我應該想到這個。而@CPlusPlusOOA和D我的編譯器是標準的Visual Studio Express 2012編譯器,並沒有警告我。這一切都順利進行,除非這不是預期的結果。 – patrik

+0

@patrik VS Express 2012有一個'-Wall'或類似的選項嗎?我從未使用2012版本。我最近使用的VS是VS Ultimate 2010,主要用於C#和C#Web服務。 –