c++ - STL std::map 动态排序

标签 c++

我知道这可能是个愚蠢的问题。但我仍然很困惑。 W.r.t std::map。我已经为 map 的动态排序编写了一个自定义谓词,

enum OrderingType 
{
    ASCENDING, 
    DESCENDING 
};

template <class T>
class Ordering
{
    OrderingType m_order;

public:
    Ordering(OrderingType order) : m_order(order) { }

    bool operator() (const T &obj1, const T &obj2)
    {
        if( m_order == ASCENDING )
            return obj1 < obj2;

        if( m_order == DESCENDING )
            return obj1 > obj2;
    } 
};

优点是

  1. 我们可以在某些条件下决定 map 中数据元素的顺序

    OrderType type = (condition ? ASCENDING : DESCENDING ); CUSTOMMAP m(类型);

  2. 我们可以对升序和降序有序映射使用相同的前向迭代器

    在下面的代码中。 map 的排序在升序和降序( amp1 和 map2 )中都很好。但是在赋值 map2 = map1 时,map2 的顺序随着内容的变化而变化。我应该只复制内容,而不是更改顺序。 map2 上的进一步插入(被声明为降序)将按升序排列。

任何建议或想法..?或者为 map 定义双向排序谓词是个坏主意..?

typedef map<int, int, Ordering<int> >  CUSTOMMAP;
typedef CUSTOMMAP::iterator       CUSTOMMAP_ITER;
typedef CUSTOMMAP::const_iterator CUSTOMMAP_CONST_ITER;

ostream& operator <<(ostream& out, const CUSTOMMAP& mapobj)
{
    CUSTOMMAP_CONST_ITER citer = mapobj.begin();
    for( ; citer != mapobj.end(); ++citer )
    {
        out << citer->first << "   " << citer->second << endl;
    } 
    out << "==========" << endl;
    return out;
}

int main()
{
    CUSTOMMAP map1(ASCENDING);     //instantiate a map with ascending sorting
    CUSTOMMAP map2(DESCENDING);    //instantiate a map with descending sorting

    map1.insert( make_pair(1, 0));
    map1.insert( make_pair(2, 0));
    cout << map1;                  // prints data in ascnding manner 

    map2.insert( make_pair(5, 0));
    map2.insert( make_pair(6, 0));
    cout << map2;                  // prints data in descending manner 

    map2 = map1;

    cout << map2;                  //copys contents of map1 to map2 & changes 
                                   //map2's ordering predicate
    return 0;
}

最佳答案

设置 map2 = map1 实际上会复制整个对象,而不仅仅是元素。那么你可能想要做的是

map2.clear();
map2.insert(map1.begin(), map1.end());

我相信这两个步骤加在一起的复杂度将是 O(n log n),但请不要引用我的话。

编辑

更好(O(n)):

map2.clear();
map2.insert(map1.rbegin(), map1.rend());

“对于第三个版本( insert (first,last) ),一般是Nlog(size+N)(其中N是first和last之间的距离,size是插入前容器的大小),但是是线性的如果 first 和 last 之间的元素已经根据容器使用的相同排序标准进行了排序。” (http://cplusplus.com/reference/STL/map/insert)

关于c++ - STL std::map 动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4457679/

相关文章:

C++ Qt QCloseEvent 不起作用

c++ - 为什么在linux信号事件中未定义静态成员的使用

c++ - 具有虚函数的类,当派生自 QObject 时,会导致链接错误

c++ - 为什么C++在对Foo <T>::Foo(T &&)的调用中不能推断T?

C++尝试按平均值对类数组进行排序,然后按递增顺序对它们进行排序

c++ - 我是否应该包含 <vector>,即使它已经包含在 <regex> 中?

c++ - 如何在 Windows 上使用 Visual C++ 强制加载链接库

将自身转换为派生类后可以访问c++基本私有(private)方法吗?

c++ - 使用指针获取函数 C++ 的多个输出

c# - 将 2D 数组从托管 C++ 传递到非托管 C++