我想要反转a的内容std::set(不仅仅是反向迭代它,而是反转内容iteslf).我发现std::set将compare作为其构造函数的函数对象.因此我想出了以下代码来做同样的事情:
#include <set>
using namespace std;
struct Comparator
{
Comparator(bool g) : m_g(g){}
bool operator()(int i1, int i2) const
{
if(m_g)
{
return i1>i2;
}
return i1<i2;
}
bool m_g;
};
int main(int argc, char** argv)
{
Comparator l(false);
set<int,Comparator> a(l);
a.insert(1);
a.insert(2);
a.insert(3);
Comparator g(true);
set<int,Comparator> b(g);
copy(a.begin(), a.end(), inserter(b, b.begin()));
a = b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这似乎适用于VC9.但这段代码是否正确?我怀疑是因为我的Comparator州与之相关.比较器是否允许拥有州?
是的,那是合法的.考虑如果不允许比较器具有状态,则允许您将比较器作为构造函数参数传递是没有意义的.:)
只要比较器提供严格的弱排序,它就可以了(除其他外,它意味着它必须是一致的.你不能在中途改变它的状态,因此它以不同的方式命令元素)