我是 c++11 的新手,想要一个 std::queue存储类 X
的实例并尽量避免在 push 中进行不必要的复制手术。在 c++11 中,我发现 push()
有一个右值引用版本:
void push (value_type&& val);
下面的实现也避免了不必要的 X
std::queue<X> my_queue;
for (...) { // some for loop
X x;
... // some initialization of x
my_queue.push(std::move(x));
}
与以下天真的实现相比?
std::queue<X> my_queue;
for (...) { // some for loop
X x;
... // some initialization of x
my_queue.push(x);
}
最佳答案
自己回答此类问题的最佳方法是创建一个探测对象。
#include <iostream>
struct probe {
probe() { std::cout << "probe()" << ((void*)this) << std::endl; }
probe(const probe&) { std::cout << "probe(c&)" << ((void*)this) << std::endl; }
probe(probe&&) { std::cout << "probe(&&)" << ((void*)this) << std::endl; }
~probe() { std::cout << "~probe()" << ((void*)this) << std::endl; }
};
并在测试中使用它代替 X。
我创建了一个 Playground here .
当您执行 std::move
时是否执行任何内容的额外拷贝完全取决于您在右值引用构造函数中键入的内容。
关于c++ - 将元素插入 std::queue 时避免复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21742341/