Перемещение элементов из 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 с самого начала, а не копирование данных.

Другие вопросы по тегам