В C++ 11, мы можем получить повышение эффективности при помощи std::move
когда мы хотим переместиться (пагубно, копия) оценивает в контейнер:
SomeExpensiveType x = /* ... */;
vec.push_back(std::move(x));
Но я не могу найти ничего идущего другим путем. То, что я имею в виду, является чем-то вроде этого:
SomeExpensiveType x = vec.back(); // copy!
vec.pop_back(); // argh
Это является более частым (поп копии) на адаптере как stack
. Мог что-то вроде этого существовать:
SomeExpensiveType x = vec.move_back(); // move and pop
Избегать копии? И это уже существует? Я не мог найти ничего как этот в n3000.
У меня есть чувство, что я пропускаю что-то крайне очевидное (как бесполезность его), таким образом, я подготовлен к "рутению dum".:3
Я могу быть совершенно неправ, но это не то, что вы хотите просто
SomeExpensiveType x = std::move( vec.back() ); vec.pop_back();
Предположим, что в SomeExpensiveType есть конструктор перемещения. (и, очевидно, верно для вашего случая)
Для Java не забудьте взять на изменение GroupUnit и ().
-121--3926441-И чтобы ответить на вопрос, который вы не задавали, эквивалент Haskell связывания последовательности» в C # называется См. замечательную статью Уэса Дайера об этом для получения подробной информации:
http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx
-121--872960-Как правило, для дорогих типов я думаю, что вы хотели бы либо класс обертки или смарт-указатель в контейнер вместо этого. Таким образом вы избегаете дорогих копий и вместо этого делаете только дешевые копии смарт-указателя или класса обертки. Вы также можете использовать необработанные указатели, если хотите хаха.
class ExpensiveWrapper
{
public:
ExpensiveWrapper(ExpensiveClass* in) { mPtr = in; }
// copy constructors here....
private:
ExpensiveWrapper* mPtr;
};
Для полноты (и для всех, кто наткнется на этот вопрос без компилятора C++1x), альтернатива, которая уже существует сегодня:
SomeExpensiveType x;
std::swap(x, vec.back());
vec.pop_back();
Она просто требует, чтобы для типа элемента существовала специализация std::swap
.