Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串数组中出现率最高的元素_C++_Arrays_String - Fatal编程技术网

C++ 字符串数组中出现率最高的元素

C++ 字符串数组中出现率最高的元素,c++,arrays,string,C++,Arrays,String,我需要找到字符串数组中出现频率最高的元素。我不知道该怎么办,因为我在这方面没有太多经验。我不知道指针/哈希表 我已经对整数做过了,但是我不能让它对字符串起作用 我的版本: #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 in

我需要找到字符串数组中出现频率最高的元素。我不知道该怎么办,因为我在这方面没有太多经验。我不知道指针/哈希表

我已经对整数做过了,但是我不能让它对字符串起作用

我的版本:

#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;
    }
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
int a[]={1,2,3,4,4,5};
int n=sizeof(a)/sizeof(int);
int*b=新的int[n];
填充n(b,n,0);//将n乘以0放入b中
int val=0;//最频繁的值
对于(int i=0;i=b[val])
val=a[i];

CUT

首先考虑使用C++容器,像向量而不是普通数组。(搜索数组到向量),或者在需要时转换它们。 然后,如果您可以使用C++11,您可以做类似的事情(没有C++11,它会变得有点长,但仍然可行):

std::string发生最多(const std::vector&vec){
std::map str_map;
用于(常量自动和str:vec)
++str_图[str];
typedef decltype(std::pair())pair_type;
自动补偿=[](常数对类型和对1,常数对类型和对2)->bool{
返回pair1.second;
}

这是一个与旧版本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;
}
bool comp(const std::pair&pair1,
const std::pair和pair2){
返回pair1.second;
}

< /代码> 您可以考虑使用一个字符串并使用一个计数事件:

#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;
} 
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
载体a;
地图m;
//用字符串填充字符串
a、 推回(“a”);
a、 推回(“b”);
a、 推回(“b”);
a、 推回(“c”);
a、 推回(“c”);
a、 推回(“c”);
a、 推回(“d”);
a、 推回(“e”);
//计算每个字符串的出现次数
对于(int i=0;isecond>it->second)
it=it2;
}

首先,它看起来几乎是一样的,但是你一直在使用
std::map
而不是
int*b
。呃..我试过地图,没有真正起作用,我在谷歌上搜索了一个小时的提示,没有找到任何有用的东西…你试过stings吗?@JohnSmith-你给了我们整数的代码。那么你的字符串代码在哪里?我没有,因为我不知道怎么做。不幸的是,我使用的是C++96或其他任何东西(“正常”代码)…我真的不知道C++11,几乎什么都不知道(除了我听说过它)JohnSmith所有现代C++程序员都应该知道C++ 11,它只是现代C++。但是我已经发布了另一个与旧C++兼容的版本。我刚开始一个月前,所以我怀疑我很快就会学会C++ 11。谢谢。虽然我理解,但是一本好的现代C++书将教你C++ 11。这是软件包的一部分。我想没有几本书需要更新,这很不幸,但有一本是“C++入门”Lippman。我通过这本书学习了C++:我现在正在阅读安德鲁·克尼格和Barbara E. Moo的加速C++。非常感谢。我会看看我能做些什么。只是一个简单的问题,为什么你使用int(in)中的参数“ARCC”??嗯,实际上没有什么。我只是习惯于编写它们,但在这种情况下,
intmain(intargc,char*argv[])
可以替换为
intmain()
该程序仍然有效。是的,我知道它有效,但我见过很多人使用它,我不知道为什么。总之,我有一个小问题,你如何通过cin手动输入向量的元素,而不是执行push_back?我尝试过为push_back(I)执行for循环但是它没有很好地工作。您可以无条件地执行
++m[a[i]]
。使用
find()检查密钥是否存在
是不必要的,因为下标操作符已经在搜索。如果它不存在,所述操作符也将创建密钥,并初始化值,即
0
,因此它在第一种情况下也会做正确的事情-从
0
开始,然后
+
1
#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;
}