【问题标题】:Fastest way to pass raw array into std::vector将原始数组传递到 std::vector 的最快方法
【发布时间】:2016-12-07 04:33:57
【问题描述】:

如果我有一个字符数组并且我想将数据推送到std::vector,那么最快的方法是什么?我目前正在使用带有push_back 方法的循环。

std::vector<char> vec;
char test[] = {'0', '1', '2', '3' };
for(size_t i = 0; i < test.size(); ++i)
  vec.push_back(test[i]);

有没有办法一次推送所有数据?

【问题讨论】:

    标签: c++ arrays c++11 vector containers


    【解决方案1】:

    只需将数组开始和结束迭代器传递给vector 构造函数。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        char test[] = {'0', '1', '2', '3' };
        std::vector<char> vec(begin(test), end(test));
    
        for(auto c: vec){
            cout << c << '\n';
        }
    }
    

    这将比您的方法更快,因为它只需要向量进行一次分配,而不是随着向量大小的增长而增量分配和复制。

    如果您的vector 在数组之前声明,您可以在循环之前调用reserve 以确保只发生一次分配。

    例如

    vec.reserve(distance(begin(test), end(test)));
    

    或使用insert 的重载取一个范围,而不是你的循环。

    vec.insert (begin(vec), begin(test), end(test));
    

    还要注意c++数组没有成员函数,所以调用test.size()是无效的。 std::array 但是有一个 size 成员函数。

    【讨论】:

    • 我认为你可以使用end(test) - begin(test) 给你大小。
    • 谢谢我只是有点懒,现在更新它以取出硬编码的大小。
    • 我喜欢这个答案,除了我试图做一个简化的例子。但我想我在你的回复中看到了答案。如果向量为空,则 begin(vec) 和 end(vec) 应放在同一位置。如果 vec 中已经有元素,那么 end(vec) 就是我想要的。 vec.insert (end(vec), begin(test), end(test));我相信这是我将使用的代码行。
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2011-12-15
    • 2014-04-18
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多