【问题标题】:Best way to copy a vector to a list in STL?将向量复制到 STL 中的列表的最佳方法?
【发布时间】:2010-10-02 06:57:15
【问题描述】:

使用迭代器遍历向量并复制到列表是最佳的复制方法。有什么建议吗?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    为什么要迭代而不使用标准复制算法?

    std::copy( vector.begin(), vector.end(), std::back_inserter( list ) );
    

    【讨论】:

    • 应该是std::copy而不是stl::copy,否则这是使用迭代器复制时的首选方法。
    【解决方案2】:

    如果您要创建一个新列表,您可以利用一个带有开始和结束迭代器的构造函数:

    std::list<SomeType> myList(v.begin(), v.end());
    

    如果您有一个想要附加到的现有列表,Kasprzol 的答案是完美的。

    【讨论】:

    • 比std::copy(vector.begin(),vector.end(),std::back_inserter(list))快吗? ?引擎盖下有什么区别?
    • 我怀疑它会更慢,它可能能够更好地优化事情。标准库的实现各不相同,所以很难确定。如果它对您很重要,请对其进行描述。
    【解决方案3】:
    list.assign(vector.begin(), vector.end());
    

    【讨论】:

    • 这很有帮助,但您可能应该在此答案中添加一些非代码以避免潜在的 VLQ 标志。
    【解决方案4】:

    我喜欢这个关于构建新列表的建议。

    std::list<SomeType> myList(v.begin(), v.end());
    

    但是当附加到现有列表时,以下可能是小型数据集的最佳选择。所谓“最优”,我的意思是最容易记住如何做和最容易理解。 (这些都是主观陈述,我相信这取决于你的大脑是如何连接的。)

    for ( unsigned i=0; i<v.size(); i++ ) myList.push_back(v[i]);
    

    在许多情况下,对向量使用迭代器可能过于迂腐。简单的索引通常可以正常工作。

    另一个线程处理迭代器与索引 (here)。在那个线程中,所采用的答案基本上首选迭代器,因为它们更通用。但如果向量是最常用的容器类型,我认为专门化这种简单的算法是合理的。

    【讨论】:

      【解决方案5】:

      您可以尝试使用&lt;algorithm&gt; 标头中更复杂的内容,例如for_eachcopy ...但在我看来,它们的作用相同。

      【讨论】:

      • for_each 将等于相同。根据提供的迭代器,可以重载复制以提供更有效的复制机制,并且通常是首选机制。
      猜你喜欢
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2010-10-20
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多