最近我开始在我的系统上使用优秀的boost :: unordered_map,但有一个缺点:我无法弄清楚如何检查其内容。在gdb上打印它会给我一个table_和一个buckets_,但是没有找到它们的位置。有人对此有所了解吗?
答案 0 :(得分:10)
对于那些想要打印机的人,我设法创建了一台打印机。这是代码:
class BoostUnorderedMapPrinter:
"prints a boost::unordered_map"
class _iterator:
def __init__ (self, fields):
type_1 = fields.val.type.template_argument(0)
type_2 = fields.val.type.template_argument(1)
self.buckets = fields.val['table_']['buckets_']
self.bucket_count = fields.val['table_']['bucket_count_']
self.current_bucket = 0
pair = "std::pair<%s const, %s>" % (type_1, type_2)
self.pair_pointer = gdb.lookup_type(pair).pointer()
self.base_pointer = gdb.lookup_type("boost::unordered_detail::value_base< %s >" % pair).pointer()
self.node_pointer = gdb.lookup_type("boost::unordered_detail::hash_node<std::allocator< %s >, boost::unordered_detail::ungrouped>" % pair).pointer()
self.node = self.buckets[self.current_bucket]['next_']
def __iter__(self):
return self
def next(self):
while not self.node:
self.current_bucket = self.current_bucket + 1
if self.current_bucket >= self.bucket_count:
raise StopIteration
self.node = self.buckets[self.current_bucket]['next_']
iterator = self.node.cast(self.node_pointer).cast(self.base_pointer).cast(self.pair_pointer).dereference()
self.node = self.node['next_']
return ('%s' % iterator['first'], iterator['second'])
def __init__(self, val):
self.val = val
def children(self):
return self._iterator(self)
def to_string(self):
return "boost::unordered_map"
答案 1 :(得分:2)
在典型的哈希表实现中,存储桶包含链表的头部,该链表实际上包含与该特定哈希对应的值。因此,我打赌buckets_
。
另一种选择:gdb现在有各种各样的python漂亮的打印机库,我认为你可以找到一个适用于C ++ 0x的文件,并检查它在哪里寻找值。