In C++11, we can get an efficiency boost by using std::move
when we want to move (destructively copy) values into a container:
SomeExpensiveType x = /* ... */;
vec.push_back(std::move(x));
But I can't find anything going the other way. What I mean is something like this:
SomeExpensiveType x = vec.back(); // copy!
vec.pop_back(); // argh
This is more frequent (the copy-pop) on adapter's like stack
. Could something like this exist:
SomeExpensiveType x = vec.move_back(); // move and pop
To avoid a copy? And does this already exist? I couldn't find anything like that in n3000.
I have a feeling I'm missing something painfully obvious (like the needlessness of it), so I am prepared for "ru dum". :3
I might be total wrong here, but isn't what you want just
SomeExpensiveType x = std::move( vec.back() ); vec.pop_back();
Assuming SomeExpensiveType has a move constructor. (and obviously true for your case)
For completeness (and anyone stumbling on this question without a C++1x compiler), an alternative that already exists today:
SomeExpensiveType x;
std::swap(x, vec.back());
vec.pop_back();
It just requires a specialization of std::swap
to exist for the element type.
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