【问题标题】:Count the number of occurrences in a string vector计算字符串向量中出现的次数
【发布时间】:2014-10-17 23:14:07
【问题描述】:

我有一个字符串类型的向量,其中包含以下内容:

tpNums contains:        2   15   38   43   50           5   14   16   29   53

我正在尝试获取向量的内容并计算向量中每个数字出现的次数,在这种情况下它们都只出现一次;以下代码:

std::map<std::string, std::size_t> results;
    std::for_each(begin(tpNums), end(tpNums), [&](std::string const& s)
    {
        ++results[s];

    });

我的问题是,如何输出结果地图的内容?

有没有更简单的方法可以解决我的问题,或者这是唯一的方法?

编辑:

我试过这个:

std::map<std::string, std::size_t> results;
    std::for_each(begin(tpNums), end(tpNums), [&](std::string const& s)
    {
        ++results[s];
        cout << results[s];

    });

输出:1112

我认为我输出的不是正确的东西,我尝试了不同的方法,但它们要么显示错误,要么输出错误的东西

【问题讨论】:

  • 显示你的cout相关代码?
  • 你说的是哪个向量?我在代码中的任何地方都看不到任何std::vector。
  • tpNums 是我从未展示过它的声明位置的向量

标签: c++ string vector map


【解决方案1】:

要转储地图的内容,您可以使用通常的map::cbegin/map::cend 循环:

for (auto it = results.cbegin(); it != results.cend(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

或者,正如 @leemes 提到的,只是

for (auto& pair : results)
    std::cout << pair.first << " => " << pair.second << '\n';

如果你有 C++11 之前的编译器,那么 map::begin/map::end:

for (std::map<string, size_t>::iterator it = result.begin(); it != result.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

【讨论】:

  • 哦,这行得通,但我认为我的地图计算的不是正确的东西,它显示了这个=&gt; 22 15 38 43 50 =&gt; 15 14 16 29 53 =&gt; 1我希望它计算每个单独的数字,但它正在计算系列数字,是因为我在向量中有多余的空格吗?
  • "5 14 16 29" 是一个字符串。不管有多少空格,它只是一个长字符串。如果你想用单个“数字序列”做一些事情,你首先必须将字符串分解成你认为是一个实体的块(或者甚至可能将它们转换为数字)。
  • 似乎 tpNums 包含 4 个字符串:"", "2 15 38 43 50", "", "1 5 14 16 29 53"。您需要先将它们拆分为单独的数字。见stackoverflow.com/questions/236129/how-to-split-a-string-in-c。 (为简单起见,您可以首先使用" " 作为分隔符将tpNum 中的所有字符串连接成一个长字符串,然后将生成的字符串拆分为一个向量,然后进行计数循环。)
  • 如果你有 C++11,你就不会为循环编写手工制作的迭代器。您将使用基于范围的 for 循环 :)
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2020-02-21
  • 2012-02-12
相关资源
最近更新 更多