【问题标题】:c++ finding same record in vectorc ++在向量中找到相同的记录
【发布时间】:2014-01-26 17:31:48
【问题描述】:

我有一个包含月份年份的向量

2013 年 1 月 2013年1月 2013年1月 2014 年 1 月 2014 年 1 月 2014 年 1 月 2014 年 1 月 2014年2月 2014 年 2 月

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

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 年 4 月、2014 年 5 月一直到 2014 年 12 月 以及 jan2015-dec2015 等等。

我认为我不应该在 从长远来看,并正在寻找一种更有活力的方法。

我不是要代码,只是一些步骤,也许会给我一些关于我应该研究哪些 c++ 方法的提示。

提前致谢

【问题讨论】:

  • 请务必在 if 语句中使用 monthyear == "...2014"

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


【解决方案1】:

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

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

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

【讨论】:

  • 这里是一个例子 #include #include #include #include int main() { std::vector<:string> v = { “Jan2013”​​、“Jan2013”​​、“Jan2013”​​、“Jan2014”、“Jan2014”、“Jan2014”、“Jan2014”、“Feb2014”、“Feb2014”}; std::map<:string size_t> m; for ( const std::string &s : v ) ++m[s]; for ( auto p : m ) std::cout
【解决方案2】:

我可能会做一个std::map&lt;monthyear, int&gt;。对于向量的每个成员,增加地图的该成员。

【讨论】:

  • @user2947249:莫斯科的弗拉德给了你一个很好的例子。
【解决方案3】:

仅出于完整性考虑:@VladfromMoscow 的解决方案最适合您对自己的输入知之甚少的一般情况。对于长度为N 的输入,它的复杂度为O(N log N)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多