2016-02-18 24 views
0

我正在嘗試編寫一個函數,它需要一個矢量,然後使用映射計算矢量中每個元素的頻率。頻率最高的那個被推入一個新的向量,然後我試圖返回要在我的主函數中輸出的向量。使用映射查找多個模式的矢量C++

vector<double> mode(vector<double> v) 
{ 
    sort(v.begin(),v.end()); 
    vector<double> modes; 
    map<int,double> frequencyCount; 
    for(size_t i; i<v.size(); i++) 
     frequencyCount[v[i]]++; 
    double current_max = 0; 
    for (auto iter = frequencyCount.cbegin(); iter != frequencyCount.cend(); ++iter) 
    { 
     if (iter ->second > current_max) 
     { 
     modes.push_back(iter->first); 
     current_max = iter->second; 
     } 
    } 
    if (current_max == 1) 
    { 
     cout << "No mode exists." << endl; 
    } 
    else 
     return modes; 
} 

我然後調用它的主:

int main() 
{ 
    vector<double> m = mode(v); 
    cout << "Mode: "; 
    for (size_t i; i<m.size(); i++) 
     cout << m[i]; 
} 

沒有錯誤,但沒有什麼是輸出...什麼建議嗎?

+2

在'main'其中'v'限定並填充? –

+1

您的地圖類型已顛倒過來。您還需要初始化它。它應該是'std :: map frequencyCount(v.size(),0);' –

+1

正如@KurtStutsman指出'std :: map'中的類型是相反的(即它應該是'std :: map '),但浮點不精確,使用'double'作爲鍵可能不會像您所期望的那樣運行。 –

回答

1
for(size_t i; i<v.size(); i++) 

您忘記將i初始化爲0.索引變量未初始化。未定義的行爲。

此外,整體算法可以通過多種方式進行改進,但這不是問題所在。

+0

呃,非常感謝!有助於有第二隻眼睛看看事情吧?非常感激。 – Tom

0

好的,經過一些調整,我也意識到我的邏輯是不正確的。該函數在current_max迭代完整地圖之前調用modes.push_back(iter->first)。因此,我改變了我的循環以找到最大頻率,然後再次遍歷地圖,從secondcurrent max匹配的地方再次打印出first。這是工作代碼,以及主要功能。還有什麼建議可以讓這個更高效?

vector<double> mode(vector<double> v) 
{ 
    sort(v.begin(),v.end()); 
    vector<double> modes; 
    map<double, int> frequencyCount; 
    for(size_t i = 0; i<v.size(); i++) 
     frequencyCount[v[i]]++; 
    double current_max = 0; 
    for (auto iter = frequencyCount.cbegin(); iter != frequencyCount.cend(); ++iter) 
    { 
     if (iter -> second > current_max) 
     { 
      current_max = iter->second; 
     } 
    } 
    for (auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it) 
    { 
     if (it -> second == current_max) 
      modes.push_back(it->first); 
    } 
    return modes; 
} 

和主:

int main() 
{ 
    vector<double> v = input(); 
    vector<double> m = mode(v); 

    cout << "Mode: "; 
    for (size_t i = 0; i<(m.size()-1); i++) 
     cout << m[i] << ", "; 
    cout << m[m.size()-1]; 
    cout << endl; 
    return 0; 
}