将元素从 std::vector 移动到 std::<T1>vector<std::p air<T1,T2>>

Moving elements from std::vector<T1> to std::vector<std::pair<T1,T2>>

本文关键字:gt std lt vector T1 air T2 元素 移动      更新时间:2023-10-16

将特定类型(T1)的vector中的元素std::移动到具有相同类型(T1)和另一类型(T2)的std::对的vector中,最正确和最有效的方法是什么?

换句话说,我应该如何写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;
}

谢谢你的时间和帮助,我真的很感激!

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

注意::对于像示例中的字符串一样小的字符串,由于SSO,移动的成本可能与复制的成本相同,如果实现决定清空源,则成本甚至可能略高。

你可以这样做:

MoveItems()开头,呼叫ActiveItems.reserve(DownloadedItems.size());。这可以防止你的数组在你往里面推东西的时候调整大小。

不呼叫push_back,呼叫emplace_back。以下是对这样做的优点的解释。

值得注意的是,在本例中,您可以通过从头开始构建std::pair而不复制数据来停止向新数据结构的复制。