我有一个字符串列表,我试图将具有特定值的所有字符串带到列表的末尾。在我编写的代码中,我试图使用仿函数和列表排序来使所有字符串等于" 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;到列表的末尾?如果没有,那么实现这一目标的好方法是什么?
答案 0 :(得分:2)
出于多种原因,您应该更喜欢使用std:partition
:
正如您所注意到的(在注释中),您只使用二进制谓词的一个参数。这使得您的二元谓词不一致 - 它并没有真正定义relevant ordering。相反,partition
中的谓词是一元的,你可以在语义上完全按照你的意愿使用它。
就复杂性而言,排序对于你所需要的东西来说太过分了,因为复杂性是Θ(n log(n);相反,partition
的复杂性是线性的。
也许你可以尝试这样的事情:
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;
}
它可以满足您的需求。
您收到的比较器错误无效,因为有两个项A
与B
进行比较,运算符返回true表示A
应该先于 {{1同时说B
应该在 B
之前。同时返回false并不意味着第二个应该在第一个之前。
无论如何,可以使用A
而不是O(n)
来降低时间复杂度。