【问题标题】:Moving elements from std::vector<T1> to std::vector<std::pair<T1,T2>>将元素从 std::vector<T1> 移动到 std::vector<std::pair<T1,T2>>
【发布时间】:2016-10-26 03:25:26
【问题描述】:

将元素从某种类型 (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;
}

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

【问题讨论】:

    标签: c++ vector move-semantics universal-reference


    【解决方案1】:
    void MoveItems()
    {
        ActiveItems.reserve(DownloadedItems.size());
        for (auto& str : DownloadedItems)
            ActiveItems.emplace_back(std::move(str), true);
    }
    

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

    【讨论】:

      【解决方案2】:

      你可以做的一些事情:

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

      而不是调用push_back 调用emplace_backHere 解释了这样做的好处。

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

      【讨论】:

      • 感谢您的回答。然而,即使调用emplace_back,它也会复制原始字符串。当我打印出DownloadedItems 的值时,执行MoveItems() 后它们仍然存在
      • 是的,但您不会创建一个临时的std::pair 然后将其复制回来。您正在就地制作这对。
      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 2013-08-18
      • 2011-01-01
      • 2014-07-13
      • 2013-03-08
      • 2011-12-27
      • 2022-10-24
      • 2016-03-30
      相关资源
      最近更新 更多