#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
bool foo(string&s1, string&s2);
int main(int args, char *argv[])
{
istringstream istrm("counts elements for which predicate p returns");
vector<string> vec;
string word;
while (istrm >> word) {
vec.push_back(word);
}
stable_sort(vec.begin(), vec.end(), foo); //Conversion Error
//sort(vec.begin(), vec.end(), foo); //Using sort is also OK.
//Below is OK.
//int size_num = 7;
//auto num = count_if(vec.begin(), vec.end(), [size_num](string &s1) {
// return s1.size() > size_num;
//});
//cout << num;
}
bool foo(string&s1, string&s2) {
return s1.size() < s2.size();
}
在将非常量参数函数传递给stable_sort
时遇到转换错误,但是count_if
很好。
从cppreference开始,使用非常量参数函数似乎完全可以。
比较功能的签名应等效于以下内容:
bool cmp(const Type1 &a, const Type2 &b);
签名不需要具有 const&,但是功能对象不得修改传递给它的对象。
我在这里做什么错了?
PS:那么algorithm
中的函数会将什么类型的对象传递给谓词?只有1个}}?只有1个}}?还是两者都可以?
答案 0 :(得分:7)
这当前是标准中的缺陷,请参见LWG 3031。
在某些情况下,现有的主要实现不适用于此类比较器,并且标准尚不清楚其是否应工作。
相似的问题:Is Comp comparator used in STL required to never change compared objects in STL?