0

我想编写一些使用模板将 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* >

但是我有一个问题,我应该为映射类之外的 N 个元素分配内存,并注意稍后释放它。

EDIT1:谢谢你们的回答,很抱歉我不能将两个答案标记为正确。

编辑2:

我已经实现了一切,但我的链接器找不到函数:

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_;

怎么了?

4

2 回答 2

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>>;
于 2012-06-13T15:12:04.750 回答
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.

于 2012-06-13T15:15:36.200 回答