Я хотел бы написать некоторый класс, который отображает int на что-то, используя шаблоны. Что я имею в виду, как правило, два варианта:map of ints to class (template)
1. unsigned int -> double (scalar)
2. unsigned int -> double[N] (vector of length N; N is the same for each int)
Я пишу класс вокруг
template <class T>
class int2type_storage {
public:
....
private:
typename std::map<unsigned int,T> map_;
}
При первом случае использование прост:
int2type_storage<double> map1;
вопрос является, что является наиболее эффективным способом/объектом для второго случая? я думал сделать что-то вроде
int2type_storage< std::vector<double> >
, но у меня есть ощущение, что это будет неоптимальным. Другой вариант для хранения указателей
int2type_storage< double* >
но у меня есть проблема, которую я должен выделить память для N элементов за пределами карты класса и заботиться, чтобы освободить его позже.
EDIT1: Спасибо, ребята, за ответ, мне жаль, что я не могу отметить два ответа как правильные.
edit2:
Я выполнил все, но мой линкер не может найти функции:
undefined reference to `int2type_storage<std::tr1::array<double, 4ul> >::init(int, int)'
.h:
template <class T>
class int2type_storage {
public:
int2type_storage() {};
~int2type_storage() {};
void init(const int number, const int index);
...
private:
int cur_index_;
typename std::map<unsigned int, T>::iterator iterator_;
typename std::vector<std::map<unsigned int,T> > map_vector_;
bool zero_initialized;
};
.cpp:
template<class T>
void int2type_storage<T>::init(const int length, const int max_index) {
map_vector_.resize(length);
}
использование:
int2type_storage< std::tr1::array<double, 4> > w_map_;
что не так?
Я сомневаюсь, что вам когда-либо придется переключать векторы на указатели, чтобы повысить производительность. – chris
Единственная причина, по которой я не буду использовать векторы, это то, что у них нет размера N. Но я не буду беспокоиться о соображениях производительности перед профилированием. – juanchopanza