将具有特定值的列表元素移动到列表末尾

时间:2016-03-03 05:35:37

标签: c++ list sorting stl

我有一个字符串列表,我试图将具有特定值的所有字符串带到列表的末尾。在我编写的代码中,我试图使用仿函数和列表排序来使所有字符串等于" Hello"到列表的末尾。

#include<iostream>
#include<list>
#include<string>
using namespace std;

struct DescendingFunctor
{
private:
    string StructString;

public:
    DescendingFunctor(string S) : StructString(S) {}

    bool operator()(const string& LHS, const string& RHS)
    {
        return LHS > StructString;
    }
};

int main()
{
    list<string> s;
    s.push_back("C++");
    s.push_back("World");
    s.push_back("Hello");
    s.push_back("Hello");
    s.push_back("World");
    s.push_back("C++");

    DescendingFunctor d("Hello");
    s.sort(d);

    return 0;
}

但是当我尝试使用此代码时,我得到一个无效的比较器错误。我知道这个错误的来源是表达式 -

return LHS > StructString;

因为当我用

替换它时
return LHS > RHS;

列表按降序排序。有什么方法可以使用list :: sort来使所有字符串等于&#34; Hello&#34;到列表的末尾?如果没有,那么实现这一目标的好方法是什么?

2 个答案:

答案 0 :(得分:2)

出于多种原因,您应该更喜欢使用std:partition

  1. 正如您所注意到的(在注释中),您只使用二进制谓词的一个参数。这使得您的二元谓词不一致 - 它并没有真正定义relevant ordering。相反,partition中的谓词是一元的,你可以在语义上完全按照你的意愿使用它。

  2. 就复杂性而言,排序对于你所需要的东西来说太过分了,因为复杂性是Θ(n log(n);相反,partition的复杂性是线性的。

  3. 也许你可以尝试这样的事情:

    std::partition(
        std::begin(s),
        std::end(s),
        [](const string &w){return w != "hello";});
    

答案 1 :(得分:1)

尝试使用此逻辑

bool operator()(const string& LHS, const string& RHS)
{
    return LHS != StructString && RHS == StructString;
}

它可以满足您的需求。

您收到的比较器错误无效,因为有两个项AB进行比较,运算符返回true表示A 应该先于 {{1同时说B 应该在 B之前。同时返回false并不意味着第二个应该在第一个之前。

无论如何,可以使用A而不是O(n)来降低时间复杂度。