C++在向量中查找相同的记录

3

我有一个向量,其中包含月份年份

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(monthyear = "Jan2013")  {
            //add count   
        }

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

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

但是程序员不可能以这种方式编写代码。如果有额外的月份年份,比如从2014年3月到2014年12月,以及2015年1月到2015年12月等等。
我认为在长期运行中,我不应该采用这种硬编码的方法,而应该寻找更加动态的方法。
我不是要求代码,只是希望得到一些步骤,并提示我应该研究哪些C++方法。
提前致谢。

4
在您的if语句中一定要使用monthyear ==“...2014” - lcs
3个回答

10

你可以使用std::map,例如:

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

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

1
这是一个例子:#include <iostream> #include <vector> #include <map> #include <string>int main() { std::vectorstd::string v = { "Jan2013", "Jan2013", "Jan2013", "Jan2014", "Jan2014", "Jan2014", "Jan2014", "Feb2014", "Feb2014" }; std::map<std::string, size_t> m; for ( const std::string &s : v ) ++m[s]; for ( auto p : m ) std::cout << p.first << '\t' << p.second << std::endl; return 0; } - Vlad from Moscow

5
我可能会使用 std::map<monthyear, int>。针对你的向量(vector)中的每个成员,都将该成员在映射(map)中递增。

@user2947249:莫斯科的弗拉德给了你一个很好的例子。 - Fred Larson

1

仅供完整性参考:@VladfromMoscow的解决方案适用于您对输入知之甚少的一般情况。对于长度为N的输入,其复杂度为O(N log N)

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

然而,如果您对输入范围有先验信息(例如,您确定它从2013年1月到2014年1月),您也可以直接运行输入并在O(N)的时间内更新预先分配的std::vector<std::pair<std::string, int>>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接