3
typedef boost::unordered_map<int, void*> OneDimentionalNodes;
typedef boost::unordered_map<int, OneDimentionalNodes> TwoDimentionalNodes;

TwoDimentionalNodes nodes;

これは有効ですか?

unordered_mapsのキーは単一の整数であるため、ハッシュ関数は使用しません。コンパイルしますが、このように繰り返すと、this-> hash_function()(k);にアクセスしようとするとクラッシュします。

for (TwoDimentionalNodes::iterator it= nodes.begin(); it != nodes.end() ; ++it)
{
   for(OneDimentionalNodes::iterator it2 = nodes[it->first].begin(); it2 != nodes[it->first].end() ; ++it2)
    {
   // do stuff
    }
}

私は他のコンテナにもオープンです

  • O(1)アクセス
  • O(n)反復
  • スパース
4

2 に答える 2

3

すべての要素を反復処理する必要があり、特定のディメンションをループする必要がない場合は、次のように、unordered_mapのキーとして単純なペアを使用できます。

typedef std::pair<int,int> Coordinates;
typedef std::unordered_map<Coordinates,void *> TwoDimensionalNodes;

(Boostの代わりにSTLを使用したことに注意してください。unordered_mapも標準STLの一部になっています)。

特定の値を取得するには、次のように記述します。

twoDimensionalNodes[std::make_pair(x,y)]

(または、その値がマップにあるかどうかわからない場合は、findを使用してください)。

繰り返すには、順序付けされていないマップを繰り返します。

for (auto it=twoDimensionalNodes.begin();it!=twoDimensionalNodes.end();++it)
   {
   std::cout << "x=" << it->first.first;
   std::cout << "y=" << it->first.second;
   std::cout << "value=" << it->second;
   }

もう少し読みやすくするために、次のように、最初にイテレータから座標を取得することをお勧めします。

for (auto it=twoDimensionalNodes.begin();it!=twoDimensionalNodes.end();++it)
   {
   Coordinates &coordinates = it->first;
   std::cout << "x=" << coordinates.first;
   std::cout << "y=" << coordinates.second;
   std::cout << "value=" << it->second;
   }

3つ以上のディメンションがある場合は、std :: tupleを使用するか、マップのキーとして使用する独自のCoordinatesクラスを作成します。

于 2012-04-20T11:30:54.010 に答える
1

から使用std::unordered_map<unordered_map>ます。次のようにstdハッシュクラスを特殊化してみてください。

namespace std
{
    template<typename T> 
    struct hash<void*>
    {
        std::size_t operator()(void * ptr) const
        {
            return (std::size_t)ptr;
        }
    };
}
于 2012-04-20T11:20:57.327 に答える