簡體   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