![](/img/trans.png)
[英]Letting a `std::vector<unsigned char>` steal memory from a `std::string`
[英]std::move between std::string and std::vector<unsigned char>
我正在使用2個庫。 一個接受並返回std::string
s而另一個使用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&&);
您可以使用迭代器來初始化。 看看這里
編輯:粘貼代碼,以便您不必去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;
}
這是不可能的。
vector
和string
類不提供分別從vector
或string
竊取任何內容的方法。 它們並不意味着交換內容。
問題是vector
和string
可能具有廣泛不同的底層表示。 通常在gcc中, string
使用舊的COW(Copy On Write)“優化”,這與典型的vector
表示(通常只是指針/ size_t屬性的三倍)有很大不同。
如果你正在處理原始字節,請責備決定將它們放入string
的庫,如果可以,則重構它。
否則:復制。 reinterpret_cast
不應該是必需的,因為char
和unsigned char
之間有隱式轉換(現在char
通常是默認unsigned
的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.