我正在使用2个库。一个接受并返回std::string
,而另一个使用std::vector<unsigned char>
s。
如果我可以从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&&);
答案 0 :(得分:11)
您可以使用迭代器进行初始化。看看here
编辑:粘贴代码,这样您就不必去了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;
}
答案 1 :(得分:8)
这是不可能的。
vector
和string
课程不提供从vector
或string
分别以外的任何其他内容窃取的方法。它们并不意味着交换内容。
问题在于vector
和string
可能有很多不同的基础表示。通常在gcc中,string
使用旧的COW(Copy On Write)“优化”,这与典型的vector
表示(通常只是指针/ size_t属性的三倍)有很大不同。 / p>
如果您正在处理原始字节,请责备决定将它们放入string
的库,并在可能的情况下重构它。
否则:复制。 reinterpret_cast
不一定是必要的,因为char
和unsigned char
之间存在隐式广告(现在char
默认为unsigned
)。