typedef boost::unordered_map<int, void*> OneDimentionalNodes;
typedef boost::unordered_map<int, OneDimentionalNodes> TwoDimentionalNodes;
TwoDimentionalNodes nodes;
这是有效的?
由于unordered_maps'的关键是单一的整数我不使用任何散列函数。 它编译,但是当我遍历它像这样,它试图访问这个 - 崩溃> 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
}
}
我也愿意与其他容器
如果你只需要在迭代器的所有元素,而且它不是在一个特定的尺寸要求的循环,那么你可以使用一个简单的对作为重点为您unordered_map,就像这样:
typedef std::pair<int,int> Coordinates;
typedef std::unordered_map<Coordinates,void *> TwoDimensionalNodes;
(注意我用STL代替升压,unordered_map现在也标准STL的一部分)。
获得一个具体的值通过简单地写:
twoDimensionalNodes[std::make_pair(x,y)]
(或使用发现,如果你不知道这值是在你的地图)。
迭代,只是遍历无序地图:
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;
}
如果你有2米以上的尺寸,使用std ::元组,或者干脆写自己的坐标类被用作地图的关键。
使用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;
}
};
}