typedef boost::unordered_map<int, void*> OneDimentionalNodes;
typedef boost::unordered_map<int, OneDimentionalNodes> TwoDimentionalNodes;
TwoDimentionalNodes nodes;
这是有效的吗?
我不使用任何散列函数,因为unordered_maps'的键是单个整数。 它编译,但当我像这样迭代时,它在尝试访问时崩溃 - &gt; 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
}
}
我也可以使用
打开其他容器答案 0 :(得分:3)
如果你只需要对所有元素进行迭代,并且不需要遍历特定维度,那么你可以使用一个简单的对作为unordered_map的键,如下所示:
typedef std::pair<int,int> Coordinates;
typedef std::unordered_map<Coordinates,void *> TwoDimensionalNodes;
(注意我使用的是STL而不是Boost,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;
}
如果您有2个以上的维度,请使用std :: tuple,或者只是编写自己的Coordinates类作为地图的关键字。
答案 1 :(得分: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;
}
};
}