C++ “перемещение от” контейнера

В 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

18
задан Raedwald 27 February 2018 в 14:42
поделиться

3 ответа

Я могу быть совершенно неправ, но это не то, что вы хотите просто

SomeExpensiveType x = std::move( vec.back() ); vec.pop_back();

Предположим, что в SomeExpensiveType есть конструктор перемещения. (и, очевидно, верно для вашего случая)

17
ответ дан 30 November 2019 в 08:38
поделиться

Для 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;

};
-1
ответ дан 30 November 2019 в 08:38
поделиться

Для полноты (и для всех, кто наткнется на этот вопрос без компилятора C++1x), альтернатива, которая уже существует сегодня:

SomeExpensiveType x;
std::swap(x, vec.back()); 
vec.pop_back();

Она просто требует, чтобы для типа элемента существовала специализация std::swap.

4
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: