为什么stable_sort函数中的ref参数需要const

时间:2014-07-25 18:25:57

标签: c++ sorting

如果我从函数参数中删除const,则clang会抛出错误。此错误与缺少const的组合仅出现在ref变量中。发生了什么事?

vector<string> v = {"the", "quick", "brown", "fox"};

bool compareWords(const string & s1, const string & s2)
{
    return s1.size() < s2.size();
}

stable_sort(v.begin(), v.end(), compareWords);

4 个答案:

答案 0 :(得分:1)

这可以帮助您确保不修改比较器的参数。

如果要在排序操作期间修改正在排序的元素,那么比较器可能会返回不一致的结果,这会破坏排序算法 - 可能产生无限的不良影响(“未定义的行为”)。

答案 1 :(得分:1)

string & s1描述为没有const的参数意味着您将在调用函数中更改基础值。但是,该值是函数的返回值 - 它不存储在任何地方,也不能更改。

(好吧,由于某些编译器魔法它存储在某个地方,但调用函数无法访问该位置,所以你仍然暗示你想要做一些你不能做的事情)

答案 2 :(得分:1)

严格来说,

bool compareWords(string & s1, string & s2)
{
    return s1.size() < s2.size();
}

应该有效。 compareWords的唯一要求是它不应该修改参数。

以下是http://en.cppreference.com/w/cpp/algorithm/stable_sort

的一些信息
  

比较函数的签名应等同于以下内容:

bool cmp(const Type1 &a, const Type2 &b);
  

签名不需要const &,但函数对象不得修改传递给它的对象。

但是,有些编译器认为参数应该是const &或者只是对象。

答案 3 :(得分:0)

根据C ++标准

  

假设comp不会应用任何非常数函数   通过解除引用的迭代器。

因此,要提供此限制,解除引用的迭代器的对象将被视为const引用。