【问题标题】:Does it make sense to apply make_move_iterator together with vector::insert ?(C++)将 make_move_iterator 与 vector::insert 一起应用是否有意义?(C++)
【发布时间】:2015-05-04 13:28:33
【问题描述】:

我有一个向量的向量,我想将它们一个一个连接起来形成一个长向量。这可以通过在末尾插入来完成。受this question 的启发,我在想使用 make_move_iterator 会用 move 代替 copy,因此效率会更高。但是下面的测试证明 make_move_iterator 会造成较大的时间消耗。

#include <iostream>
#include <string>
#include <vector>
#include <chrono>
using namespace std;

int main()
{
    string a = "veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongstring";
    vector<string> b(10,a);
    vector<vector<string> > c(1000,b);
    vector<string> d,e;

    auto t1 = chrono::system_clock::now();
    for(auto& item : c)
    {
        d.insert(d.end(),item.begin(),item.end());
    }
    cout << c[0][0].length() << endl;

    auto t2 = chrono::system_clock::now();
    for(auto& item:c)
    {
        e.insert(e.end(), std::make_move_iterator(item.begin()),std::make_move_iterator(item.end()));
    }

    auto t3 = chrono::system_clock::now();    
    cout << chrono::duration_cast<chrono::nanoseconds>(t2-t1).count() << endl;
    cout << chrono::duration_cast<chrono::nanoseconds>(t3-t2).count() << endl;
    cout << c[0][0].length()  << endl;
    cout << "To check that c has been moved from." <<endl;
}

//Output:
//122
//1212000
//1630000
//0
//To check that c has been moved from.

所以我想知道,这种方法真的有助于提高效率吗?

【问题讨论】:

  • 无法复制,在我的系统上移动版本的速度大约是复制版本的两倍。
  • @KerrekSB 谢谢。是的,我意识到我使用的在线编译器可能已经过时了。以后我会坚持ideone。

标签: c++ vector insert iterator move


【解决方案1】:

问题描述中的测试是在cpp shell进行的

我后来在ideone 上进行了尝试,结果发现 make_move_iterator 显然更有效。所以它似乎是一个依赖于编译器的东西。

122
320576
98434
0
To check that c has been moved from.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2012-09-13
    • 2017-09-17
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多