更容易计算向量中相同字符串的方法?

Mod*_*red 1 c++ string vector map

我试图得到一个矢量中所有相同字符串数量的输出作为一个更大的程序的一部分.经过大量的研究,我已经设法将一些有用的东西放在一起但看起来很混乱,我想知道是否有更好的方法来做到这一点.

#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>

using namespace std;

void setMap(string i);
void addMap(string i);
map<string, int> myMap;

int main()
{
    vector<string> myVector;
    string myArray[6]={"foo","foo","bar","roo","foo","bar"};
    for (int i=0; i<6; i++)
    {
        myVector.push_back(myArray[i]);
    }
    for_each (myVector.begin(), myVector.end(), setMap);
    for_each (myVector.begin(), myVector.end(), addMap);
    for (map<string, int, less< string >>::const_iterator iter = myMap.begin();
      iter != myMap.end(); ++iter )
      cout <<iter->first<<'\t'<<iter->second<<endl;
    return 0;
}

void setMap(string i)
{
    myMap[i]=0;
}

void addMap(string i)
{
    myMap[i]++;
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作得很好,并给了我以后的输出,但我不是那么热衷于必须添加2个额外的函数才能使它工作或者必须使地图全局化.我们将非常感激地收到任何提示.

joh*_*ohn 5

那么没有额外功能而没有将地图作为全局的最简单方法就是不使用for_each.

for_each (myVector.begin(), myVector.end(), setMap);
for_each (myVector.begin(), myVector.end(), addMap);
Run Code Online (Sandbox Code Playgroud)

map<string, int> myMap;
for (vector<string>::iterator i = myVector.begin(); i != myVector.end(); ++i)
    myMap[*i]=0;
for (vector<string>::iterator i = myVector.begin(); i != myVector.end(); ++i)
    ++myMap[*i];
Run Code Online (Sandbox Code Playgroud)

完成后,您还可以删除第一个循环

map<string, int> myMap;
for (vector<string>::iterator i = myVector.begin(); i != myVector.end(); ++i)
    ++myMap[*i];
Run Code Online (Sandbox Code Playgroud)

因为地图值无论如何都将初始化为零.

是什么让你认为你必须使用for_each呢?