我写的代码如下,我不知道为什么成员变量标志在排序过程后不等于1?有人可以给我一些建议。
代码:
class Func{
public:
int flag;
Func()
{
flag = 0;
}
bool operator()(int &l, int &r)
{
if(l==r)
{
flag = 1;
}
return l > r;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> a;
int b[] = {11,8,7,6,4,3,4,1};
for(int i = 0; i <sizeof(b)/sizeof(b[0]); i++)
{
a.push_back(b[i]);
}
Func FuncObj = Func();
std::sort(begin(a), end(a), FuncObj);
return 0;
}
答案 0 :(得分:1)
According to reliable documentation,std::sort
按值接受函数对象。这意味着Func
使用的std::sort
是FuncObj
的副本。这意味着当4与4进行比较时,副本的flag
变量设置为1,FuncObj
保持不变。 <{1}}返回时会复制该副本,因此std::sort
会丢失。
最简单的解决方案将flag
定义为int flag
,static int flag
的所有实例共享相同的Func
。
如果这不是一个选项,不同的Flag
必须有自己的Func
,我倾向于使用std::shared_ptr
。每个默认构造的flag
都拥有它自己的Func
并与任何副本共享此flag
。
然而Benjamin Lindley提醒std::reference_wrapper
,这为这个问题提供了一个更方便的解决方案。包装器按值传递并复制,而不是它引用的flag
,允许在Func
内修改源Func
。
std::sort