使用sort和function对象,但是函数对象不能修改成员变量

时间:2017-08-19 06:15:33

标签: c++ sorting

我写的代码如下,我不知道为什么成员变量标志在排序过程后不等于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;
}

1 个答案:

答案 0 :(得分:1)

According to reliable documentationstd::sort按值接受函数对象。这意味着Func使用的std::sortFuncObj的副本。这意味着当4与4进行比较时,副本的flag变量设置为1,FuncObj保持不变。 <{1}}返回时会复制该副本,因此std::sort会丢失。

最简单的解决方案将flag定义为int flagstatic int flag的所有实例共享相同的Func

如果这不是一个选项,不同的Flag必须有自己的Func,我倾向于使用std::shared_ptr。每个默认构造的flag都拥有它自己的Func并与任何副本共享此flag

然而Benjamin Lindley提醒std::reference_wrapper,这为这个问题提供了一个更方便的解决方案。包装器按值传递并复制,而不是它引用的flag,允许在Func内修改源Func

std::sort