2011-12-25 3 views
1

Моя декларация была unordered_map<Comparison,int> Chs, когда Comparison - это имя класса. Теперь у меня мало вопросов;unordered_map (A) конструктор, (B) delete allocate in, (C) inherit from

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

Вы предпочитаете не наследовать от стандартных контейнеров, они не были предназначены для этого.

Также, как уже упоминалось, для того, чтобы содержащиеся в нем сравнения выполнялись полиморфно, вам необходимо либо хранить ссылки, либо указатели. Указатели гораздо проще в работе.

Во избежание проблем с освобождением памяти используйте интеллектуальные указатели (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...)) { } 
Смежные вопросы