1

std:: 特定の型 (T1) のベクトルから同じ型 (T1) と別の型 (T2) の std::pair のベクトルに要素を移動する最も正確で効率的な方法は何ですか?

つまり、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;
}

お時間を割いてご協力いただき、誠にありがとうございました。

4

2 に答える 2

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

NB: あなたの例のような小さな文字列の場合、移動は SSO によるコピーと同じコストがかかるか、実装がソースを空にすることを決定した場合、おそらくわずかにコストがかかる可能性があります。

于 2016-10-26T04:43:05.703 に答える
0

あなたができるいくつかのこと:

の開始時にMoveItems()、 を呼び出しますActiveItems.reserve(DownloadedItems.size());。これにより、配列に物をプッシュしている間に配列のサイズが変更されるのを防ぎます。

push_backcallを呼び出す代わりにemplace_backここでは、その利点について説明します。

この例では、データをコピーするのではなく、最初から を構築するだけで、新しいデータ構造へのコピーを停止できることに注意してくださいstd::pair

于 2016-10-26T03:36:33.630 に答える