2016-10-26 20 views
1

要素を特定の型(T1)のベクトルからベクトルに移動する最も正確で効率的な方法は何ですか?同じタイプ(T1)と別のタイプ(T2)のstd :: pairのペア?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は:あなたの例ではもののように小さな文字列の場合、移動が原因SSOへのコピーと同じコストを持っている、または実装が、とにかくソースを空にすることを決定した場合、おそらく少しでもより高価なことがあります。

0

あなたが行うことができますいくつかの点:

MoveItems()の開始時に、ActiveItems.reserve(DownloadedItems.size());を呼び出します。これにより、配列をサイズ変更するのを防ぐことができます。

push_backを呼び出す代わりに、emplace_backを呼び出します。 Hereはそのような利点の説明です。

この例では、最初からstd::pairを作成し、データをコピーしないで、コピーを新しいデータ構造に停止することができます。

+0

ありがとうございます。しかし、 'emplace_back'を呼び出しても元の文字列のコピーを作成しています。 'DownloadedItems'の値を表示するには、MoveItems()を実行した後もまだそこにいます。 –

+0

はい、一時的な' std :: pair'を作っていないので、それを元に戻していません。ペアをインプレースで作っています。 – druckermanly

関連する問題