gpt4 book ai didi

c++ - emplace_back() 未按预期运行

转载 作者:IT老高 更新时间:2023-10-28 12:57:05 28 4
gpt4 key购买 nike

我编写了一个简单的程序来尝试在标准库容器中就地创建对象。这是我写的:

#include <vector>
#include <iostream>

class AB
{
public:
explicit AB(int n);
AB(const AB& other) = delete;
AB(AB&& other);
AB& operator=(const AB& other) = delete;
AB& operator=(AB&& other) = default;
private:
int i;
};

AB::AB(int n): i( n )
{
std::cout << "Object created." << std::endl;
};

AB::AB(AB&& other): i( std::move(other.i) )
{
std::cout << "Object moved." << std::endl;
};

int main()
{
std::vector< AB > v;
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
};

我用 g++(4.8.2 版)编译它。运行输出后,我得到:

Object created.
Object created.
Object moved.
Object created.
Object moved.
Object moved.

但我期待的是这样的:

Object created.
Object created.
Object created.

我认为安置的全部意义在于摆脱移动构造函数调用。 AB类有什么要求没有满足吗?

感谢您的帮助。

最佳答案

问题是当您添加更多元素时,您的 vector 正在调整大小,从而导致额外的移动。如果一开始就预留了足够的容量,就会得到预期的结果:

   std::vector< AB > v;
v.reserve(3);
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);

给予

Object created.
Object created.
Object created.

在 gcc 4.8.2 上。请注意,您可以通过查看 v.capacity() 来跟踪原始代码中 vector 的增长。

关于c++ - emplace_back() 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23948442/

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