我有以下代码提取,让我有点恼火:
CBlockIndex * pblockindex = mapBlockIndex [hash]; (1)
,而:
typedef boost::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap
所以我的问题是,因为Blockmap使用3个参数(uint356,CBlockindex *和Blockhasher)创建了地图变量,所以&#34; C ++知道&#34;在(1)中分配哪个正确的参数?我认为既不会将BlockHasher的价值和uint256的价值分配给pblockindex,但我不知道为什么?
也许我应该解释我对地图变量的理解很差:我想地图(在这种情况下)是三倍的值。我将它放在一个例子中让我的问题更加清晰:我们引入了一个Sex类型的变量性别(plockindex,CblockIndex)并为它分配一个地图变量值 - 映射类型为Human的变量john类型。我们如何确保将jsex分配给性而不是jname或jage?谢谢你的耐心:D
答案 0 :(得分:1)
boost::unordered_map
模板参数是
template<typename Key,
typename Mapped,
typename Hash = boost::hash<Key>,
typename Pred = std::equal_to<Key>,
typename Alloc = std::allocator<std::pair<Key const, Mapped>> >
在您的情况下,这些模板参数是
boost::unordered_map<uint256, CBlockIndex*, BlockHasher>
// ^Key ^Mapped ^Hash
uint256 // Key
CBlockIndex* // Mapped
BlockHasher // Hash
因此,要回答您的问题,BlockHasher
不会用作键,也不会用作映射值。它只是Hash的模板参数。
CBlockIndex* pblockindex = mapBlockIndex[hash];
// ^value ^map ^key
如果仍然不清楚,请查看std::unordered_map
template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;
请注意,在您的案例中,Key
为uint256
,T
为CBlockIndex*
。 Hash
为BlockHasher
,KeyEqual
和Allocator
将是模板中提供的默认值。
修改强>:
我认为你误解了模板参数。地图仅以这种方式工作:给定key
找到相应的value
。所有其他参数都有助于实现细节。因此,在您的情况下,jage
将是关键,而jname
将是值。第三个参数jsex
将是哈希函数。
如果您想要一张可以通过多个按键查找的地图,则需要修改您的密钥。例如,假设我们想要找到一个人类的性别,我们知道他们的名字和年龄,我们可以说
std::map<std::pair<std::string, int>, std::string> humans;
// ^key( ^name ^age) ^sex
所以我们可以说
humans[{"David", 35}] = "male";
注意密钥现在是std::pair
,其中包含多个条目?这是因为我们的map
具有
Key = std::pair<std::string, int>
T = std::string
其他模板参数Hash
,KeyEqual
和Allocator
保留为默认值。