注册地图(模板)

时间:2012-06-13 15:07:21

标签: c++ stl map

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

出了什么问题?

2 个答案:

答案 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