Emplace_back()的行为不符合预期
emplace_back() does not behave as expected
我编写了一个简单的程序来处理在标准库容器中就地创建对象的问题。这是我写的:
#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类是否有未满足的要求?
谢谢你的帮助。
问题是,当您添加更多元素时,您的矢量正在调整大小,导致额外的移动。如果一开始就预留了足够的容量,就会得到预期的结果:
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()
来跟踪原始代码中矢量的增长。
放置的目的是摆脱COPY构造函数调用。它可能会移动物体,因为当它满了的时候会调整矢量的大小。移动物体是可以的。复制对象的成本很高。
相关文章:
- 将 QByteArray 转换为无符号短:不符合预期
- 为什么此模板函数的行为不符合预期?
- 为什么 std::basic_ostream::运算符<<不符合 CONST 资格?
- std::vector 构造initializer_list的行为不符合预期
- C++使用 LZ4 进行压缩,压缩信息不符合预期
- 为什么 std::future::wait_for 的行为不符合预期?
- Seekg 的行为不符合预期
- Int 附加到字符,行为不符合我的预期
- NDK r16b std::istringstream 的行为不符合预期
- 为什么std::is_copy_constructible的行为不符合预期
- 我的代码到底在哪里不符合键和值类型的规范
- 如果库的包含路径设置不符合预期,如何引发编译错误
- 为什么 [std::is_move_assignable] 的行为不符合预期?
- 代码片段在某些情况下有效,但不符合预期,为什么
- 对指针行为不符合预期行为的 const 引用
- 字节不符合记忆映射和对文件进行排序
- srand() 范围不符合预期的 C++
- 简单的字符串输出不符合预期(出现换行符)
- 为什么根据 C++11 标准,std::seed_seq是不可复制的,为什么 gcc/clang 不符合?
- 如果没有c++11,易编程8.91就不符合要求