的std ::的std :: string和std ::向量之间移动(std::move betwe

2019-09-17 00:45发布

我有2个图书馆工作。 一个取入并返回std::string s,而另一个使用std::vector<unsigned char>秒。

这将是很好的,如果我能偷从底层阵列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&&);

Answer 1:

这是不可能的。

vectorstring类不提供方式,从东西比其他偷vectorstring 分别 。 他们的目的不是交流的内容。

这个问题的问题是, vectorstring可以有广泛不同的底层表示。 典型地,在GCC例如, string使用老气COW(写时复制)“优化”,这是从典型的广泛不同的vector表示(通常只是一个三重指针/为size_t属性)。

如果你正在处理的原始字节,责怪决定把它们放进图书馆string ,如果你可以重构它。

否则:副本。 该reinterpret_cast ,因为不应该是必要的charunsigned char ,它们之间(现在隐式转换char通常unsigned默认情况下)。



Answer 2:

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

编辑:粘贴代码,这样你就不必去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;
}


文章来源: std::move between std::string and std::vector