首页 文章

STL std :: map动态排序

提问于
浏览
3

我知道这可能是一个愚蠢的问题 . 但我很困惑 . 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;
    } 
};

优点是

  • 我们可以在某些条件下决定 Map 中数据元素的排序

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

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

在下面的代码中 . map的排序在升序和降序(amp1和map2)中都能正常工作 . 但是在赋值map2 = map1时,map2的顺序随内容一起变化 . 我被期望只复制内容,而不是订单的变化 . map2上的进一步插入(声明为降序)将按升序排列 .

Any suggestions or idea..? or defining two way ordering predicate for map is bad idea..?

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;
}

2 回答

  • 0

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

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

    我相信这两个步骤的复杂性将会是 O(n log n) ,但不要引用我的话 .

    Edit

    更好( O(n) ):

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

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

  • 5

    比较器对象(不仅仅是类型)成为 Map 的成员 . 在赋值时,复制元素和比较器 . 这就是为什么map2获得与map1相同的顺序 .

    要复制元素,可以使用 map2.insert(map1.begin(), map1.end()) .

相关问题