C ++优雅地预测了大部分字符串数组

时间:2014-03-02 17:45:24

标签: c++ arrays

我有一个包含5个字符串的数组,我希望能够将字符串相互比较,以确定是否存在多数,并返回该多数。所以如果:

a[0] = "dog";
a[1] = "dog";
a[2] = "dog";
a[3] = "dog";
a[4] = "cat";

我想要归还“狗”。在2个相同,2个相同和一个的情况下,我希望它返回“没有多数”。有没有办法在没有大量if语句的情况下做到这一点,换句话说,优雅呢?

3 个答案:

答案 0 :(得分:4)

你可以使用字典:

std::unordered_map<std::string, unsigned int> historgram;
std::string most_popular;
unsigned int m = 0;
bool unique = false;

for (s : a)
{
    unsigned int & i = histogram[s];
    ++i; 
    if (i == m) { unique = false; }
    else if (i > m) { unique = true; m = i; most_popular = s; }
}

return unique ? most_popular : "no majority"'

答案 1 :(得分:2)

将它们放在哈希表中,其中键是单词,值是出现次数。当您将它们放入哈希表时,检查最大计数。

不仅你避免使用ifs,而且(最重要的是)无论数组的长度是多少都可以。

答案 2 :(得分:1)

一个简单的方法是让std::map<std::string, int>将每个字符串映射到数组中的频率。

for (auto str : a) {
  frequencies[str]++;
}

然后,您可以在之后搜索地图以获得最高频率,或者您可以在上面的循环中跟踪到目前为止的最大值。