考虑这样一种需求:
输入若干个字符串,记录所有输入的字符串和它们出现的次数,然后按输入的次序输出结果。
输入:
aaa bbb aaa ccc zxc ccc
输出
aaa 2
bbb 1
ccc 2
zxc 1
无论map还是unordered_map都是不符合要求的,map会将键值按字典序排列,而unordered_map则是按照键值的hash值,将相同hash值的元素放入同一个桶中,元素并不按输入的次序排列。
顺序容器可以满足按输入次序排列的要求,而要建立多个值的联系可以用 Struct 或者 Pair,由于这里是两个值(string int)的联系,所以选用pair< string,int>
//容器选用
vector<pair<string,int>> vp;
每当我们给出一个字符串str,首先要判断这个字符串是否在容器中出现过,如果没有,插入{str,1};如果已经出现过,则需要将second+1。
现在问题的关键就是在容器vp中按string查找,vp的value_type是pair< string,int>,如何通过比对string来查找呢?
使用泛型算法 find_if
- find_if(beg,end,unaryPred)
算法接收一对迭代器以及一个一元谓词,返回第一个符合条件的元素的迭代器,未找到则返回尾后迭代器
我们可以用lambda表达式作为一元谓词,同时捕获需要比对的字符串str
auto it = find_if(vp.begin(), vp.end(), [&](const pair<string, int>& p) {
return p.first == str;
});
这样就可以仅通过string在vp中查找了
完整功能的代码如下
string temp;
cin >> temp;
auto it = find_if(vp.begin(), vp.end(), [&](const pair<string, int>& p) {
return p.first == temp;
});
if (it == vp.end())
{
vp.push_back({ temp,1 });
}
else
{
++it->second;
}