我想编写一些使用模板将int映射到某个东西的类。 我在想的通常有两种选择:
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* >
但是我有一个问题,我应该为map-class之外的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_;
出了什么问题?
答案 0 :(得分:4)
在编译时已知N
,您可以使用std::array<double,N>
:
int2type_storage< std::array<double, N> >
我不确定int2type_storage
包装器的原因是什么,但您也可以使用C ++ 11模板typedef:
template <typename T, int N>
using int2type_storage = std::map<unsigned int, std::array<T,N>>;
答案 1 :(得分:3)
如果你有C ++ 11,std::array
是最好的,还有Boost.Array。
如果你不这样做,那么你可以这样写:
template <size_t N>
struct Doubles {
double data[N];
};
然后直接使用.data
来访问它,或者根据需要添加任意数量的成员函数和运算符重载。如果您添加正确的,那么最终您将拥有std::array
。
double*
的主要用途是复制地图(或者有多个地图),并且您希望它们引用相同的数据。但正如您所知,它会产生资源管理问题,因此您可以考虑shared_array<double>
。您也可以考虑不共享数据。
还有一种特殊情况,即C ++ 03中的元素被复制到容器中,而在C ++ 11中,通过在某些情况下将它们移动到容器中可以获得潜在的效率提升。但是数组(包括std::array
和我上面的类)无法有效移动。如果N
很大,并且正在进行大量复制,那么可能可以有效移动的内容可能效果更好,因此您可以再次考虑std::vector
。