将地图变量的值分配给另一个变量

时间:2015-05-19 13:59:54

标签: c++ boost bitcoin

我有以下代码提取,让我有点恼火:

  

CBlockIndex * pblockindex = mapBlockIndex [hash]; (1)

,而:

  • mapBlockIndex是一个BlockMap变量
    • BlockMap定义如下:
      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

1 个答案:

答案 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;

请注意,在您的案例中,Keyuint256TCBlockIndex*HashBlockHasherKeyEqualAllocator将是模板中提供的默认值。

修改
我认为你误解了模板参数。地图仅以这种方式工作:给定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

其他模板参数HashKeyEqualAllocator保留为默认值。