有关unordered_map的C ++结构化绑定问题

时间:2019-08-27 05:15:17

标签: c++

我正在学习C ++ 17的新功能,并且遇到了这个问题:

std::vector<int> nums = { 1, 1, 2, 3 };
std::unordered_map<int, size_t> m;
for (int i = 0; i < nums.size(); ++i)
{
    const auto& [inserted_entry, inserted_happen] = m.emplace(nums[i], i);
    std::cout << inserted_happen << "\n";
}

结果是:

1
0
1
1

这是怎么回事?我不明白。

insert_entry又是什么?

3 个答案:

答案 0 :(得分:4)

emplace返回一对迭代器到插入的元素(或已经存在的元素)和一个bool,表示插入是否成功。

inserted_happenbool

第二次插入失败,因为1已作为映射中的键存在。

答案 1 :(得分:2)

emplace返回std::pair<iterator, bool>,然后将其“解构”并创建2个绑定。 inserted_entry是对迭代器部分的引用,inserted_happen是对bool部分的引用。

答案 2 :(得分:2)

emplace的返回值是一对。

该对中的第一个元素是新插入的元素(如果插入成功)或现有元素(如果插入失败)的迭代器。

返回的对中的第二部分是一个bool值(在您的情况下为inserted_happen),指示插入是否成功。

在您的情况下,第二个emplace失败,因为您已经插入了键等于1的元素。

如果要更改元素的value部分,可以尝试-

m[nums[i]] = i;