繁体   English   中英

std ::在std :: string和std :: vector之间移动<unsigned char>

[英]std::move between std::string and std::vector<unsigned char>

我正在使用2个库。 一个接受并返回std::string s而另一个使用std::vector<unsigned char> s。

如果我可以从std::stringstd::vector<unsigned char>窃取底层数组并且能够在没有过多复制的情况下将它们移动到彼此中,这将是一件好事。

ATM我使用的东西如下:

const unsigned char* raw_memory =
    reinterpret_cast<const unsigned char*>(string_value.c_str()),
std::vector<unsigned char>(raw_memory, raw_memory + string_value.size();

另一种方式:

std::string(
    reinterpret_cast<const char*>(&vector_value[0]),
    vector_value.size());

能够定义一个以下内容会好得多:

std::string move_into(std::vector<unsigned char>&&);
std::vector<unsigned char> move_into(std::string&&);

您可以使用迭代器来初始化。 看看这里

编辑:粘贴代码,以便您不必去ideone。 仍然保留链接,以便您可以使用代码进行循环播放

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

int main() {
        string a = "Hello world";
        vector<unsigned char> v(a.begin(), a.end());
        for (int i= 0 ;i<  v.size(); ++i) {
           cout << v[i] << endl;
        }
        string s(v.begin(), v.end());
        cout << s << endl;
        return 0;
}

这是不可能的。

vectorstring类不提供分别vectorstring窃取任何内容的方法。 它们并不意味着交换内容。

问题是vectorstring可能具有广泛不同的底层表示。 通常在gcc中, string使用旧的COW(Copy On Write)“优化”,这与典型的vector表示(通常只是指针/ size_t属性的三倍)有很大不同。

如果你正在处理原始字节,请责备决定将它们放入string的库,如果可以,则重构它。

否则:复制。 reinterpret_cast不应该是必需的,因为charunsigned char之间有隐式转换(现在char通常是默认unsigned的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM