If I push an existing object into a queue:
struct Node {int x; int y;};
std::vector<Node> vec;
vec.push_back(Node(1, 3));
std::queue<Node> q;
q.push(vec[0]);
At the last line, does q
store the address (pointer or reference, whatever except the object itself) of vec[0]
, or does it copy the whole Node
object into q
?
It will get copied as you assign an rvalue reference. It will get moved if you assign an lvalue reference. (temporary object).
To check, use copy constructor / operator and move constructor / operator overloading:
#include <iostream>
#include <vector>
#include <queue>
struct Node {
int x;
int y;
Node(int x, int y) : x(x), y(y)
{
std::cout << "constructor" << std::endl;
}
Node(Node const & original) : x(original.x), y(original.y)
{
std::cout << "copy constructor" << std::endl;
}
Node(Node const && original) : x(original.x), y(original.y)
{
std::cout << "move constructor" << std::endl;
}
Node & operator=(Node const & original) {
std::cout << "assignment operator" << std::endl;
if(this != &original) {
x = original.x;
y = original.y;
}
return *this;
}
Node & operator=(Node const && original) {
std::cout << "move operator" << std::endl;
if(this != &original) {
x = original.x;
y = original.y;
}
return *this;
}
};
int main() {
std::vector<Node> v;
Node n(1,3); // constructor
Node m(3, 4); // constructor
m = n; // assignment operator
n = Node(2, 3); // constructor + move operator
v.push_back({1,2}); // constructor + move constructor
v.push_back(n); // copy constructor
std::queue<Node> q;
q.push(v[0]); // copy constructor
return 0;
}
It does create a copy. In fact, you can always find out where a copy or move occurs by overwriting the copy or move constructors:
class Node
{
public:
Node(int x, int y) { std::cout << "Create node" << std::endl; }
Node(const Node&) { std::cout << "Copy node" << std::endl; }
Node(Node&&) { std::cout << "Move node" << std::endl; }
virtual ~Node() = default;
};
For your program this prints
Create node Move node Copy node
Since
std::vector<Node> vec;
vec.push_back(Node(1, 3)); // Creates a temporary node and moves it into the vector.
std::queue<Node> q;
q.push(vec[0]); // Copys the node.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With