0

テンプレートを使用して int を何かにマップするクラスを書きたいと思います。私が考えているのは、一般的に2つのオプションです。

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;

問題は、2 番目のケースで最も効率的な方法/オブジェクトは何かということです。私は何かをすることを考えていました

 int2type_storage< std::vector<double> >

しかし、これは最適ではないと感じています。別のオプションは、ポインタを格納することです

 int2type_storage< double* >

しかし、マップクラスの外側の N 要素にメモリを割り当て、後で解放するように注意する必要があるという問題があります。

EDIT1: ご回答いただきありがとうございます。2 つの回答を正しいものとしてマークできないことを残念に思います。

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

どうしたの?

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 に答える