Перемещение элементов из std::vector<T1> в std::vector<std:: pair <T1, T2 >>
Каков наиболее правильный и эффективный способ std:: переместить элементы из вектора определенного типа (T1) в вектор из std:: pair того же типа (T1) и другого типа (T2)?
Другими словами, как мне написать MoveItems()?
#include <iostream> // For std::string
#include <string> // For std::string
#include <vector> // For std::vector
#include <utility> // For std::pair
using std::vector;
using std::string;
using std::pair;
vector<string> DownloadedItems;
vector<pair<string,bool>> ActiveItems;
vector<string> Download()
{
vector<string> Items {"These","Words","Are","Usually","Downloaded"};
return Items;
}
void MoveItems()
{
for ( size_t i = 0; i < DownloadedItems.size(); ++i )
ActiveItems.push_back( std::pair<string,bool>(DownloadedItems.at(i),true) );
}
int main()
{
DownloadedItems = Download();
MoveItems();
return 0;
}
Спасибо за ваше время и помощь, я действительно ценю это!
2 ответа
void MoveItems()
{
ActiveItems.reserve(DownloadedItems.size());
for (auto& str : DownloadedItems)
ActiveItems.emplace_back(std::move(str), true);
}
NB. Для строк, таких же маленьких, как в вашем примере, перемещение может стоить столько же, сколько и копирование из-за единого входа, или, возможно, даже немного дороже, если реализация все равно решит опустошить источник.
Некоторые вещи, которые вы можете сделать:
В начале MoveItems()
, вызов ActiveItems.reserve(DownloadedItems.size());
, Это предотвращает изменение размера вашего массива, пока вы в него вставляете.
Вместо звонка push_back
вызов emplace_back
, Вот объяснение преимуществ этого.
Стоит отметить, что в этом примере вы можете остановить копирование в новую структуру данных, просто создав std::pair
с самого начала, а не копирование данных.