我有2个图书馆工作。 一个取入并返回std::string
s,而另一个使用std::vector<unsigned char>
秒。
这将是很好的,如果我能偷从底层阵列std::string
和std::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&&);
这是不可能的。
该vector
和string
类不提供方式,从东西比其他偷vector
或string
分别 。 他们的目的不是交流的内容。
这个问题的问题是, vector
和string
可以有广泛不同的底层表示。 典型地,在GCC例如, string
使用老气COW(写时复制)“优化”,这是从典型的广泛不同的vector
表示(通常只是一个三重指针/为size_t属性)。
如果你正在处理的原始字节,责怪决定把它们放进图书馆string
,如果你可以重构它。
否则:副本。 该reinterpret_cast
,因为不应该是必要的char
和unsigned char
,它们之间(现在隐式转换char
通常unsigned
默认情况下)。
您可以使用迭代器使用的初始化。 看看这里
编辑:粘贴代码,这样你就不必去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;
}