2013-02-24 140 views
0

我需要查找字符串数组中出现次数最多的元素。我不知道该怎么做,因为我没有太多的经验。我不知道指针/哈希表。字符串数组中出现次数最多的元素

我已经完成了整数,但我不能让它适用于字符串。

我的版本:

#include <iostream> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int a[]={1,2,3,4,4,4,5}; 
    int n = sizeof(a)/sizeof(int); 
    int *b=new int [n]; 
    fill_n(b,n,0); // Put n times 0 in b 

    int val=0; // Value that is the most frequent 
    for (int i=0;i<n;i++) 
     if(++b[a[i]] >= b[val]) 
      val = a[i]; 

    cout<<val<<endl; 
    delete[] b; 
    return 0; 
    } 

查找字符串数组中最频繁出现的元素任何帮助表示赞赏!

+1

它可能看起来几乎相同的方式,但你一直在使用'std :: map '而不是'int * b'。 – LihO 2013-02-24 19:52:52

+0

呃..我试过地图,没有真正使它工作,我一直在谷歌搜索一小时的提示,没有设法找到有用的东西... – 2013-02-24 20:02:36

+0

你为什么尝试刺? – 2013-02-24 20:04:43

回答

0

你可以考虑使用vector字符串和使用一个版本兼容0计数事件:

#include <iostream> 
#include <vector> 
#include <map> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    vector<string> a; 
    map<string, int> m; 

    // fill a with strings 
    a.push_back("a"); 
    a.push_back("b"); 
    a.push_back("b"); 
    a.push_back("c"); 
    a.push_back("c"); 
    a.push_back("c"); 
    a.push_back("d"); 
    a.push_back("e"); 

    // count occurrences of every string 
    for (int i = 0; i < a.size(); i++) 
    { 
     map<string, int>::iterator it = m.find(a[i]); 

     if (it == m.end()) 
     m.insert(pair<string, int>(a[i], 1)); 

     else 
     m[a[i]] += 1; 
    } 

    // find the max 
    map<string, int>::iterator it = m.begin(); 
    for (map<string, int>::iterator it2 = m.begin(); it2 != m.end(); ++it2) 
    { 
     if (it2 -> second > it -> second) 
     it = it2; 
    } 

    cout << it -> first << endl; 
    return 0; 
} 

这种解决方案可能不是优雅和效率方面最好的一个,但它应该给的想法。

+0

非常感谢。我会看看我能用这个做什么。只是一个简单的问题,为什么你在int main()中使用参数“argc”? – 2013-02-24 20:40:53

+0

好吧,实际上没有什么。我只是习惯写它们,但在这种情况下'int main(int argc,char * argv [])'可以用'int main()'代替,程序仍然可以工作。 – 2013-02-24 20:45:43

+0

是的,我知道它的工作原理,但我见过很多人使用它,我不知道为什么。无论如何,我有一个小问题,你如何手动输入元素通过CIN的矢量,而不是做push_back?我试过为push_back(i)做一个for循环,但是效果不好。 – 2013-02-24 20:49:22

1

首先,考虑使用C++容器而不是普通数组。 (如果需要,搜索“数组到矢量”或它们以在它们之间进行转换)。

然后,如果您可以使用C++ 11,可以这样做(没有C++ 11,它会变成有点冗长,但仍是可行的):

std::string most_occurred(const std::vector<std::string> &vec) { 
    std::map<std::string,unsigned long> str_map; 
    for (const auto &str : vec) 
    ++str_map[str]; 

    typedef decltype(std::pair<std::string,unsigned long>()) pair_type; 

    auto comp = [](const pair_type &pair1, const pair_type &pair2) -> bool { 
    return pair1.second < pair2.second; }; 
    return std::max_element(str_map.cbegin(), str_map.cend(), comp)->first; 
} 

这是与旧的C++

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

std::string most_occurred(const std::vector<std::string> &vec) { 
    std::map<std::string,unsigned long> str_map; 
    for (std::vector<std::string>::const_iterator it = vec.begin(); 
     it != vec.end(); ++it) 
    ++str_map[*it]; 
    return std::max_element(str_map.begin(), str_map.end(), comp)->first; 
} 
+0

不幸的是,我使用的是C++ 96或其它任何东西(“正常”的)。我并不真正了解C++ 11,几乎没有任何关于它的信息(除了我听说过它) 。 – 2013-02-24 20:16:47

+0

@JohnSmith所有现代的C++程序员都应该知道C++ 11,它只是现代C++。但是我仍然发布了与旧版C++兼容的另一个版本。 – user2015453 2013-02-24 20:28:04

+0

我刚刚开始一个月前,所以我很怀疑我很快就会学习C++ 11。感谢您转换它。 – 2013-02-24 20:42:22

相关问题