2017-02-16 8 views
0

Я relativly новичок в C++, и это может быть глупый вопрос, но я пытаюсь понять rValue и lValue ссылки на данный момент, и это пришло мне в голову:C++ скопировать карту в вектор с станд :: двигаться

Предположим, у нас есть карта (которая поступает из базы данных или что-то еще), и мы хотим скопировать все ее значения в вектор.

void insertItems(std::vector<std::string>& v) 
{ 
    std::map<int, std::string> names = loadFromDb(); 

    for (auto& kv : names) 
    { 
     v.push_back(std::move(kv.second)); 
    } 
} 

Можно ли использовать std::move здесь? std::string предоставляет конструктор перемещения и (возможно, не для строки, но для более крупных объектов) конструктор перемещения намного быстрее, чем конструктор копирования. Также мы знаем, что мы не используем элементы карты где-то еще, и они выходят за рамки, как только мы покидаем функцию. Так верно ли мое презумпция?

Я не вижу противоречия в своих мыслях, но это сложная тема, и я боюсь пропустить что-то. P.S .: Я думаю, что вопрос не самый лучший. Если у вас есть лучший, не стесняйтесь его редактировать.

+3

Реализация правильная. «v.reserve» - это еще одна оптимизация. – Jarod42

+1

О, и помните, что 'v' не является указателем. –

+0

О да, спасибо, вы абсолютно правы. Я исправил это – Cilenco

ответ

5

Можно ли использовать std::move здесь?

Если вы уверены, что в будущем вы не сможете получить доступ к перенесенным значениям, да.


Вы также можете использовать std::vector::reserve для предварительно выделить необходимое пространство в v.

v.reserve(v.size() + names.size()); 
+2

Я думаю, вы имеете в виду 'v.reserve (v.size() + names.size());' поскольку 'v' может быть пустым изначально. – emlai

+0

@tuple_cat: хорошая точка, спасибо! –

+0

Если я не использую 'reserve' каждый раз, когда я вставляю новые значения, будет создана копия вектора? – Cilenco

3

Можно ли использовать std::move здесь?

Да. Код выглядит отлично.

1

В случае, когда вы показываете, тогда перемещение будет прекрасным, поскольку вы не будете использовать карту или ее значения позже.

Если карта не была значением (например, если она была ссылкой), или вам нужно использовать значения в ней позже, значит это неправильно.