2013-04-30 32 views
0

我做了一个程序,它从文件中获取数据,将其放入向量中,然后检查向量中最频繁的元素。 (使用map) 问题是当我在数据中有相同数量的元素时(两个Element1,2个Element2,1个Element3)。它返回Element1,我需要它传递“没有最频繁元素”的信息。 我的代码如下所示:C++在地图中最频繁的元素

using namespace std; 

bool comp(const pair<string, unsigned long> &pair1, 
     const pair<string, unsigned long> &pair2) { 
    return pair1.second < pair2.second; 
} 

string Odczyt::tokenizer() { 

    inFile.open("baza.txt"); 

    while (!inFile.eof()) { 
     for (int i = 0; i < 4; i++) { 
      inFile >> row1[i] >> row2[i] >> row3[i] >> row4[i]; 
     } 
    } 

    sVector1.assign(row1, row1 + 3); 

    string w1 = most_occurred(sVector1); 

    return w1; 

} 

string Odczyt::most_occurred(vector<string> &vec) { 

    map<string, unsigned long> str_map1; 

    for (vector<string>::const_iterator it = vec.begin(); it != vec.end(); 
      ++it) { 
     ++str_map1[*it]; 
    } 

    return max_element(str_map1.begin(), str_map1.end(), comp)->first; 
} 
+0

什么都要你的逻辑打破关系是什么?你只是没有回报什么或所有的关系? – andre 2013-04-30 15:45:04

+0

我只需要最频繁的元素,如果有任何或没有信息。 – user2336450 2013-04-30 15:55:56

回答

0
#include <iostream> 
#include <string> 
#include <vector> 
#include <map> 
using namespace std; 

string most_occurred(vector<string> &vec) { 
    map<string, unsigned long> str_map1; 
    std::string max_element = ""; 
    int max_count = 0; 

    typedef vector<string>::const_iterator iter; 
    iter end = vec.end(); 

    for (iter it = vec.begin(); it != end; ++it) { 
     int count = ++str_map1[*it]; 
     if(count == max_count) max_element = "no max found"; 
     if(count > max_count) { 
      max_count = count; 
      max_element = *it; 
     } 
    } 

    return max_element; 
} 

int main() { 
    std::string arr1[5] = {"aa" , "bb", "cc", "dd", "ee"}; // no max found 
    std::string arr2[5] = {"aa" , "aa", "cc", "dd", "ee"};// aa 
    std::string arr3[5] = {"aa" , "aa", "cc", "cc", "ee"}; // no max found 
    std::vector<std::string> input1(arr1, arr1+5); 
    std::vector<std::string> input2(arr2, arr2+5); 
    std::vector<std::string> input3(arr3, arr3+5); 
    std::cout << most_occurred(input1) << std::endl; 
    std::cout << most_occurred(input2) << std::endl; 
    std::cout << most_occurred(input3) << std::endl; 
} 

结果是:

no max found 
aa 
no max found 

以下测试导致no max found

int main() { 
    std::string arr1[24] = {"Element1", "Element2", "Element33", "1", 
    "Element1", "Element2", "Element33", "2", "Element11", "Element2", 
    "Element33", "2", "Element11" "Element21" "Element31", "2", "Element11", 
    "Element21", "Element31", "1", "Element12", "Element21", "Element31", 
    "1"}; // no max found 
    std::vector<std::string> input1(arr1, arr1+24); 
    std::cout << most_occurred(input1) << std::endl; 
} 

如果上面的代码返回std :: string(“”),那么没有最大元素,否则它将返回最大值。

+0

我一直在玩你最近几分钟给出的答案。它不输入if(count == max_count)max_element =“”;部分。它仍然是最常见的元素。我的测试数据文件看起来像:元素1元素2 Element33 1 元素1元素2 Element33 2 Element11元素2 Element33 2 Element11 Element21 Element31 2 Element11 Element21 Element31 1 Element12 Element21 Element31 1 – user2336450 2013-04-30 16:14:23

+0

@ user2336450我测试上面的代码和它的工作,我会期待它。 – andre 2013-04-30 16:26:14

+0

@ user2336450我刚刚测试了您的输入,并且发现没有找到最大结果。你确定你解析文件正确吗? – andre 2013-04-30 16:36:44

1

创建存储的次数你已经找到发生m次(其中m是倍的电流最大数量已经出现任何元素的元素)的变量。如果在算法的终止点你有多于一个元素出现m次,那么你知道没有一个最频繁出现的元素。

+0

我一直在试图做到这一点,但我真的找不到如何从地图中获取我需要的信息 – user2336450 2013-04-30 16:02:34

0

这是这里的频繁操作是我的示例代码:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <map> 
#include <iterator> 

using namespace std; 

int main(int argc, char* argv[]) { 
    // number -> frequency 
    map<int, int> idfreq = {{1, 3}, {2, 10}, {3,8}, {9, 15}, {7,30}}; 
    vector<pair<int, int> > v; 
    copy(idfreq.begin(), idfreq.end(), back_inserter(v)); 
    for (auto& el : v) { 
     cout << el.first << " " << el.second << endl; 
    } 
    cout << endl; 
    make_heap(v.begin(), v.end(), [](const pair<int,int> &a, const pair<int,int> &b){ return a.second < b.second; }); 
    // with -std=c++14 
    //make_heap(v.begin(), v.end(), [](auto& a, auto& b){ return a.second < b.second; }); 
    cout << v.front().first << " " << v.front().second << " most frequent element\n"; 
    cout << "after make heap call\n"; 
    for (auto& el : v) { 
     cout << el.first << " " << el.second << endl; 
    } 
    cout << endl; 

    return 0; 
}