1

私の宣言はunordered_map<Comparison,int> ChswhenComparisonがクラス名でした。いくつか質問があります。

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

例:

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

このコードはコンパイルエラーになります。

newB.この宣言で(で) 割り当てられたメモリを解放する方法は?

C. 継承クラス:

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

RCA questionのような要素で初期化できるように、コンストラクターをどのように記述すればよいですか?

ありがとう、そして私の下手な英語でごめんなさい。

4

1 に答える 1

1

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

また、前述のように、含まれている比較を多態的に動作させるには、参照またはポインターを格納する必要があります。ポインタの操作ははるかに簡単です。

メモリの解放について心配する必要をなくすために、スマートポインタ(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...)) { }
于 2011-12-25T20:44:07.080 に答える