程序的实质是:获取一个map,其中的值是来自传入字符串的char,键是字符串中这些值的个数
using namespace std;
map<char, int> is_merge(const string& s) {
map<char, int> sCount {};
for (auto lp : s) {
if (find_if(sCount.begin(), sCount.end(), lp) != sCount.end()) {
sCount[lp] += 1;
} else {
sCount.insert(make_pair(lp, 0));
}
}
return sCount;
}
int main()
{
string test = "aba";
map <char, int> res = is_merge(test);
for (auto lp : res) {
cout << lp.first << ":" << lp.second << endl;
}
return 0;
}
但是控制台出现错误:/usr/include/c++/12/bits/predefined_ops.h:318:30: error: expression cannot be used as a function 318 | {return bool(_M_pred(*__it));} | ~~~~~~~^~~~~~~
std::find_if
接受谓词而不是值。因此出现lp
不是可调用对象的错误。要在映射中找到键,您应该使用std::map::find
,因为std::find
/std::find_if
与O(n)
相比,它是O(logn)
(作为经验法则,您可以记住:如果容器具有与泛型算法相同的成员函数,则成员函数至少同样有效,通常更好)。
但是,不需要通过find
检查密钥是否存在。函数可以是这样的:
map<char, int> is_merge(const string& s) {
map<char, int> sCount {};
for (auto lp : s) {
++sCount[lp];
}
return sCount;
}
std::map::operator[]
已经插入了一个给定键没有找到的元素。你不需要自己去做。
PS:如果你调用insert
,那么就没有必要调用std::make_pair
:sCount.insert({lp, 0});
。std::make_pair
用于需要从参数推断出std::make_pair
对的类型时,但这里不需要。
PPS:如果你使用std::find
,你需要考虑你的地图的元素类型是std::pair<const char, int>
,而不是char
。