2011-12-25 12 views
1

がクラス名の場合、私の宣言はunordered_map<Comparison,int> Chsでした。 今私はいくつか質問があります。unordered_map(A)コンストラクター、(B)delete allocate in、(C)から継承する

A.コンストラクタが呼び出されたときに、いくつかの要素を挿入するにはどうすればよいですか(vectorで完了しました)?

unordered_map<Comparison,int> Chs = 
{ 
    (new Equal_to<int>,10), 
    (new Not_equal_to<int>,30),   
    (new Greater<int>,20) 
}; 

このコードはコンパイルエラーです。

B.この宣言で割り当てられたメモリ(new)を解放するにはどうすればよいですか?継承クラスで

C.:

template <class T,class V> 
class RC : public unordered_map<T, V> 

どのように私はRCコンストラクタを記述する必要がありますので、その質問のような要素を初期化することができますか?

ありがとう、貧しい私の英語についてはごめんなさい。

+0

:それはあなたの他のコンストラクタが必要と競合しない場合は、完全な転送のコンストラクタはこれが正しく動くのセマンティクスをサポートすることの利点を持っているでしょう。 – pmr

答えて

1

標準のコンテナを継承するのではなく、そのために設計されたものではありません。

また、前述のように、Comparisonsが多態的に振る舞うようにするには、参照またはポインタを格納する必要があります。ポインタは操作がはるかに簡単です。

メモリを解放することを心配することを避けるために、スマートポインタ(std :: unique_ptrまたはstd :: shared_ptr)を使用します。

次のコードは、独自のコンテナクラス上に均一な初期化を行う方法を含め、上記のほとんどの働き(RC<>)を示しています(おそらく役に立たない最適化の部門で

#include <unordered_map> 
#include <memory> 

struct Comparison {}; 
template <class T> struct Equal_to  : Comparison { }; 
template <class T> struct Not_equal_to : Comparison { }; 
template <class T> struct Greater  : Comparison { }; 

template <class T,class V> 
class RC 
{ 
    typedef std::unordered_map<T,V> comps_t; 
    typedef typename comps_t::value_type value_type; 
    comps_t comps; 

    public: 
    RC(std::initializer_list<value_type> init) : comps(init) { } 
}; 

int main(int argc, const char *argv[]) 
{ 
    RC<std::shared_ptr<Comparison>, int> demo = { 
     { std::make_shared<Equal_to<int>>(),10 }, 
     { std::make_shared<Not_equal_to<int>>(),30 },   
     { std::make_shared<Greater<int>>(),20 } }; 

    return 0; 
} 

を、あなたが持つことができます。あなたはこの作品を作るために `の比較*`のコンテナが必要

template <typename... A> 
    RC(A&&... a) : comps(std::forward<A...>(a...)) { } 
関連する問題