2010-12-16 20 views
3

これは愚かな質問かもしれません。しかし、私は混乱しています。 W.r.t std :: map。私はSTL std :: map dynamic ordering

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

利点は我々が

OrderTypeタイプ=(いくつかの条件にマップ内のデータ要素の順序を決めることができ

  1. で、マップのdymanic発注のカスタム述語を書かれています条件?昇順:DESCENDING); カスタムマップm(タイプ)。

  2. 我々は両方の&は、以下のコードで注文マップ

    降順昇順に同じ前方イテレータを使用することができます。地図の注文は両方とも昇順で動作します(&降順)。しかし、割り当てmap2 = map1では、map2の順序はコンテンツとともに変化します。私は、注文の変更ではなく、コンテンツのみをコピーすることが期待されていました。さらにmap2(これは降順として宣言された)上の挿入は昇順になります。

任意の提案またはアイデア..またはマップのための2つの方法順序付け述語を定義することは悪い考えです..?まあmap2 = map1設定

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

答えて

5

オブジェクト全体だけでなく、要素をコピー実際にしようとしています。あなたはおそらくその後、やりたいことは、私が一緒に2段階の複雑さはO(n log n)になるだろうというのが私の頭の上から信じているが、それで私を引用していない

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

です。

編集

さらに良い(O(n)):

第三のバージョンについて
map2.clear(); 
map2.insert(map1.rbegin(), map1.rend()); 

」Nであり(一般的には、Nlog(サイズ+ N)((最初、最後)を挿入)最初と最後の間の距離、および挿入前のコンテナのサイズのサイズ)が、最初と最後の間の要素がコンテナによって使用された同じ順序付け基準に従って既にソートされている場合は線形です。 (http://cplusplus.com/reference/stl/map/insert)

+0

複雑さに関する編集の良い点。 –

+0

@ user470379: 'clear' +' insert'の代わりに 'assign'を使うかもしれません。 –

+0

複雑さに関する素晴らしい説明....多くの助けを受けました... – Naveen

0

比較オブジェクト(型だけでなく)はマップのメンバーになります。割り当て時に、要素とコンパレータの両方がコピーされます。そのため、map2はmap1と同じ順序を取得します。

要素をコピーするだけでmap2.insert(map1.begin(), map1.end())を使用できます。

+1

あなたはそのマップがreverse_iteratorをサポートしていると考えることもできます。昇順を望む場合はm.begin()、m.end()、降順を使用する場合は(m.rbegin()、m.rend())を使用します。 –

+0

ya ....私の目的は違う...データが昇順または降順に格納されなければならないかどうかはわからない。実行と操作両方のケースで同じです...私はいつも同じもののelseを使ってうんざりしていました.. if(condition)forward_iter else reverse_iter ...両方のiterタイプもジェネリックプログラミングと同じではありません... – Naveen

関連する問題