2016-10-26 3 views
1

Что является самым правильным и эффективным способом std :: перемещать элементы из вектора определенного типа (T1) в вектор из std :: пары того же типа (T1) и другого типа (T2)?Перемещение элементов из std :: vector <T1> в std :: vector <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; 
} 

Спасибо за ваше время и помощь, я действительно ценю это!

ответ

0
void MoveItems() 
{ 
    ActiveItems.reserve(DownloadedItems.size()); 
    for (auto& str : DownloadedItems) 
     ActiveItems.emplace_back(std::move(str), true); 
} 

N.B .: Для строк, как малые, как те, в вашем примере, перемещение может иметь такую ​​же стоимость, как копирование из-за единый вход, или, возможно, даже немного дороже, если реализация решает освободить из источника в любом случае.

0

Некоторые вещи, которые вы можете сделать:

В начале MoveItems(), вызовите ActiveItems.reserve(DownloadedItems.size());. Это предотвращает изменение размера массива при нажатии на него.

Вместо того, чтобы звонить push_back звонок emplace_back. Here - это объяснение преимуществ этого.

Стоит отметить, что в этом примере вы можете остановить копию в новой структуре данных, просто создав std::pair с самого начала, а не копируя данные.

+0

Благодарим вас за ответ. Однако даже при вызове 'emplace_back' он создает копию исходных строк. Когда я отправляюсь распечатывать значения 'DownloadedItems', они все еще существуют после выполнения' MoveItems() ' –

+0

Да, но вы не создаете временную' std :: pair', а затем копируете ее. Вы делаете пару на месте. – druckermanly

Смежные вопросы