c++错误:表达式不能用作函数(find_if)



程序的实质是:获取一个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_ifO(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

最新更新