c ++在向量中找到相同的记录

时间:2014-01-08 14:39:42

标签: c++ algorithm map asymptotic-complexity word-count

我有一个包含monthyear的载体

Jan2013 Jan2013 Jan2013 Jan2014 Jan2014 Jan2014 Jan2014 Feb2014 Feb2014

基本上我想要做的是搜索向量,对于每个相同的记录,对它们进行分组 一起喜欢 例如

total count for Jan2013 = 3; 
total count for Jan2014 = 4; 
total count for Feb2014 = 2;

当然,正如我们所知,我们只需编写多个if if to solve it

        if(monthyear = "Jan2013")  {
            //add count   
        }

        if(monthyear = "Jan2014")  {
            //add count   
        }

        if(monthyear = "Feb2014")  {
            //add count   
        }

但程序员不会以这种方式编写代码。 如果有额外的一年的2014年3月,2014年4月,2014年5月一直到2014年12月 和2015年1月 - 2015年12月等等。

我认为我不应该采用这种硬编码方法 长期以来,寻找更有活力的方法。

我不是要求代码,而只是一些步骤,或许可以给我一些关于我应该研究什么样的c ++方法的提示。

提前致谢

3 个答案:

答案 0 :(得分:10)

您可以使用std::map。例如

std::map<std::string, size_t> m;

for ( const std::string &s : v ) ++m[s];

答案 1 :(得分:5)

我可能会做std::map<monthyear, int>。对于向量的每个成员,递增该成员的地图。

答案 2 :(得分:1)

为了完整起见:@VladfromMoscow的解决方案对于您对输入知之甚少的一般情况是最佳的。对于长度为O(N log N)的输入,其复杂度为N

同样,您可以先在O(N log N)中对输入进行排序,然后在排序的输入上迭代O(N)并将计数存储在std::vector<std::pair<std::string, int>>中。

但是,如果您有关于输入范围的先验信息(比如说确定它从2013年1月开始运行到2014年1月),您还可以直接运行您的输入并更新std::vector<std::pair<std::string, int>>复杂度中预先分配的O(N)