1

将元素从某种类型(T1)的向量 std::move 到相同类型(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

你可以做的一些事情:

在开始时MoveItems(),调用ActiveItems.reserve(DownloadedItems.size());. 这可以防止您在将内容推入其中时调整阵列的大小。

而不是调用push_backcall emplace_back是对这样做的好处的解释。

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

于 2016-10-26T03:36:33.630 回答
0
void MoveItems()
{
    ActiveItems.reserve(DownloadedItems.size());
    for (auto& str : DownloadedItems)
        ActiveItems.emplace_back(std::move(str), true);
}

注意:对于与您示例中的字符串一样小的字符串,由于 SSO,移动的成本可能与复制的成本相同,或者如果实施决定无论如何清空源代码,成本可能会更高。

于 2016-10-26T04:43:05.703 回答