更好的计算方法?

Aus*_*yde 0 c++ stl

在我的一个学校课程中,我使用以下函数来计算字符串中标识符的频率,用换行符和#分隔:

输入:

dog
cat
mouse
#
rabbit
snake
#
Run Code Online (Sandbox Code Playgroud)

功能:

//assume I have the proper includes, and am using namespace std
vector< pair<string,int> > getFreqcounts(string input) {
    vector<string> items = splitString(input,"\n");
    map<string,int> counts;

    for (int i=0; i<items.size(); i++) {
        if (items[i] == "#") continue;
        counts[items[i]] = 0;
    }
    for (int i=0; i<items.size(); i++) {
        if (items[i] == "#") continue;
        counts[items[i]]++;
    }

    return vector< pair<string,int> > (counts.begin(),counts.end());
}
Run Code Online (Sandbox Code Playgroud)

我想至少

  • 删除double for循环
  • 找到一个更好的方法来获得一个 vector< pair<string,int> >

有任何想法吗?

顺便说一句,这不是功课.真正的家庭作业将使用这个功能,但这完全出于我自己的好奇心和渴望拥有"更好"的代码.

fbr*_*eto 5

我的理解std::map是,可以简单地消除整个第一个循环.当您第一次尝试访问不存在的节点时,map将默认为您创建它,将初始计数设置为零(内置类型的默认行为.)这应该是您需要进行的所有更改对你的代码,行为应该是相同的.

更新:在您提供的代码中的旁注counts将根据operator<定义的std::string(地图的键类型)进行排序,这将按map字典顺序对节点进行排序.没有必要通过矢量抽取结果并对矢量进行排序 - 地图会自动为您处理.