将 `QByteArray` 转换为 `std::vector<char>` 的最佳方法?

she*_*ing 1 c++ qt c++17

我正在尝试以尽可能少的开销将数据从另一个移动QByteArray到另一个。std::vector<char>

目前我找到了4种方法,哪一种的性能最好呢?有更好的解决方案吗?您希望在代码审查中看到哪一个?

#include <QDebug>
#include <vector>

int main() {

    auto b = QByteArray("hello");
    std::vector<char> v;

    // 1
    v = std::vector<char>(*b.data(),b.size());

    // 2
    v = std::vector<char>(b.begin(),b.end());

    // 3
    std::move(b.begin(),b.end(),std::back_inserter(v));

    // 4
    v.resize(b.size());
    std::memcpy(&v[0],b,b.size());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mil*_*nek 6

只需使用您的cbegin和迭代器初始化向量:cendQByteArray

int main() {
    QByteArray b("hello");
    std::vector<char> v(b.cbegin(), b.cend());
}
Run Code Online (Sandbox Code Playgroud)

这会将数据复制到b其中v,并且是您可以获得的最佳选择。

使用cbeginand很重要cend,因为QByteArray使用写时复制来避免在复制对象时复制其基础数据,直到其中一个副本对其执行了一些潜在的修改操作。由于数据可以通过非常量begin和方法返回的迭代器进行修改,如果您要复制的数据本身之前已被复制过,end那么它们可能会导致数据被额外复制一次。QByteArray

由于QByteArray::iteratoris 是一个随机访问迭代器,v在从 复制数据之前会自动预先分配足够的空间b,因此无需手动分配reserve空间。

另外,由于char是一种简单的类型,因此使用std::move.