gpt4 book ai didi

c++ - 为什么在键检查 map::emplace 之前调用对象的构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:58 24 4
gpt4 key购买 nike

有这样的代码:

class HugeConstructor
{
public:
HugeConstructor(int n)
{
std::cout << n << std::endl;
}
};

int main()
{
std::map<int, HugeConstructor> m;
m.emplace(1, 10);
m.emplace(1, 10);

return 0;
}

我希望有一个 10 的输出,但我得到了两个。这意味着正在构建对象,尽管实际上根本不需要它。

这有什么理由吗?这似乎非常违反直觉。

我正在使用 g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4,使用 g++ -c -Wall -std=c++11 -lpthread 编译

最佳答案

在引擎盖下, map 是作为红黑树实现的。例如,对于 libc++ 和 libstdc++ 就是如此。需要构造元素以便在树中找到其父元素:

libstdc++:

 1613       _M_emplace_unique(_Args&&... __args)
1614 {
1615 _Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1616
1617 __try
1618 {
1619 typedef pair<iterator, bool> _Res;
1620 auto __res = _M_get_insert_unique_pos(_S_key(__z));
1621 if (__res.second)
1622 return _Res(_M_insert_node(__res.first, __res.second, __z),

libc++:

template <class _Tp, class _Compare, class _Allocator>
pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
__tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)
{
__node_base_pointer __parent;
__node_base_pointer& __child = __find_equal(__parent, __nd->__value_);
__node_pointer __r = static_cast<__node_pointer>(__child);
bool __inserted = false;
if (__child == nullptr)
{
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));

关于c++ - 为什么在键检查 map::emplace 之前调用对象的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com