我有一个向量载体,我想将它们一个接一个以形成一个长向量。这可以通过在末尾插入来完成。受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.


因此,我想知道这种方法是否真的有助于提高效率?

最佳答案

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

后来我尝试了ideone,结果证明make_move_iterator明显更有效。因此,这似乎是与编译器有关的事情。

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

关于c++ - 将make_move_iterator与vector::insert一起应用是否有意义?(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28839550/

10-15 00:38
查看更多