STL std :: map dynamic ordering

I know this might be a dumb question. but I have a confusion. Wrt std :: map. I wrote my own predicate for dymanic ordering of the 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;
    } 
};

Advantage

  • We can decide the ordering of data elements on a map under certain conditions

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

  • We can use the same formatting iterator for both the ascending and descending ordered maps

    . , (amp1 map2). map2 = map1 map2 . , . map2 ( ) .

..? - ..?

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 ordering predicate
    return 0;
}
+3
2

Well 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

( ) . , . map2 , map1.

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

0

Source: https://habr.com/ru/post/1780603/


All Articles