在C++中反转集合的内容

Ash*_*sha 3 c++ stl

我想要反转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州与之相关.比较器是否允许拥有州?

jal*_*alf 6

是的,那是合法的.考虑如果不允许比较器具有状态,则允许您将比较器作为构造函数参数传递是没有意义的.:)

只要比较器提供严格的弱排序,它就可以了(除其他外,它意味着它必须是一致的.你不能在中途改变它的状态,因此它以不同的方式命令元素)

  • 这就是为什么你无法访问集合本身使用的比较器的原因.(您可以使用`std :: set <> :: key_comp()`获取它的副本,但这会返回值,因此您只能获得要使用的副本.) (2认同)

Kar*_*tel 5

这很好,但它不必要地复杂。

您可以只使用std::less(该模板参数的默认值!)或std::greater标准库中的值。它们由 提供<functional>