我正在学习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又是什么?
答案 0 :(得分:4)
emplace
返回一对迭代器到插入的元素(或已经存在的元素)和一个bool
,表示插入是否成功。
inserted_happen
是bool
。
第二次插入失败,因为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;