конструктор unordered_map (A), (B) удалить размещение, (C) наследовать от - PullRequest
1 голос
/ 26 декабря 2011

Мое объявление было unordered_map<Comparison,int> Chs, когда Comparison - имя класса. Теперь у меня есть несколько вопросов;

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, чтобы он мог инициализироваться с такими элементами, как вопрос?

Спасибо, и извините за мой плохой английский.

1 Ответ

1 голос
/ 26 декабря 2011

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

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

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