私は次のタスクに直面しています。unsignedintのトリプレットをゼロまたは正(double)の値にマップします。そして、与えられたトリプレットがダブルを取得するか、実際にはゼロであると言うことができます。
私は次の単純化を持っています:最初(それをIと呼びましょう)と2番目(それをJと呼びましょう)intは既知の範囲(ゼロからIMAXとJMAXまで)にあります。3番目のインデックス(K)については、トリプレットの推定値(3番目のインデックスは分散している)を知っています。計算中、トリプレットの成長数、より正確には、特定のIとKについて、3番目のインデックスの数が増える可能性があります。
これまでのところ、次の解決策があります。
マップのベクトルのベクトルを保持します:
vector< vector < map <unsinged int, unsigned int>>> tri_map_;
//^I ^J ^K ^index
'index'がゼロでない場合は、補足ベクトルから値を取得します。
vector< double> values;
values[index];
すべてを次のように初期化します。
tri_map_.resize(IMAX);
for (int i=0;i<IMAX;++i) tri_map_[i].resize(JMAX);
その解決策についてどう思いますか?それを行うためのより良い方法はありますか?
私が嫌いなのは、マップの「予約」のようなことはできないようだということです。十分なメモリを割り当てて(3番目のインデックスの見積もりがあります)、そのための十分なメモリがあるかどうかを確認する方法はありますか?それを除けば、私はそれに満足しています。
編集1:IMAX〜数百のJMAX〜10 ^ 5
EDIT2:seheのソリューションを取り入れようとしていますが、unordered_setとペア用です。だから、それは私が問題を抱えているところですspecialization of ‘template<class _Tp> struct std::tr1::hash’ in different namespace
:... EDIT3:次の作品は、その速度を調査します。提案やアドバイスをありがとうございました!
#include <tr1/functional>
#include <vector>
#include <map>
#include <tr1/unordered_set>
#include <list>
#include <set>
#include <tr1/array>
#include <iostream>
struct pair_int {
unsigned int first;
unsigned int second;
bool operator< (pair_int const& o) const {
if ( first < o.first )
return true;
if ( first > o.first )
return false;
return second < o.second;
}
bool operator==(pair_int const& o) const {
return ( (first==o.first)&&(second==o.second) );
}
};
namespace std {
namespace tr1 {
template<> struct hash<pair_int> {
unsigned int operator()(pair_int const& key) const {
return ~key.first + 17u*key.second;
}
};
}
}
class pair_storage {
public:
pair_storage() {};
~pair_storage();
....
private:
pair_int pair_ij_;
std::map<pair_int,double>::iterator pairMapIterator_;
std::vector< std::map<pair_int,double> > pairMapVector_;
std::vector< std::tr1::unordered_set< pair_int > > pairMapVectorZero_;
};
cosでコンパイルできません-std=c++0x
大きなコードのいくつかの部分で問題があります...