我正在使用一個 C 庫,它使用各種固定大小的unsigned char陣列,沒有空終止符作為字串。
我一直在將它們轉換為std::string使用以下功能:
auto uchar_to_stdstring(const unsigned char* input_array, int width) -> std::string {
std::string temp_string(reinterpret_cast<const char*>(input_array), width);
temp_string.erase(temp_string.find_last_not_of(' ') 1);
return temp_string;
}
除了使用之外,它作業正常,reinterpret_cast需要傳遞陣列大小以及我將陣列衰減為指標的事實。我試圖避免使用std::span.
使用的函式std::span如下所示:
auto ucharspan_to_stdstring(const std::span<unsigned char>& input_array) -> std::string {
std::stringstream temp_ss;
for (const auto& input_arr_char : input_array) {
temp_ss << input_arr_char;
}
return temp_ss.str();
}
該函式運行良好,使其他一切變得更簡單,而無需跟蹤 C 陣列的大小。但是,通過一些基準測驗(使用nanobench)進一步挖掘表明,新函式比經典reinterpret_cast方法慢了大約 6 倍。我的假設是基于 - 的函式中的for回圈是這里的低效率。std::span
我的問題:是否有更有效的方法將固定大小的無符號字符 C 陣列從std::span變數轉換為 a std::string?
uj5u.com熱心網友回復:
你要:
auto ucharspan_to_stdstring(std::span<unsigned char const> input_array) -> std::string {
return std::string(input_array.begin(), input_array.end());
}
string與其他stand library 容器一樣,可以從適當的迭代器對構造——這就是這樣的一對。由于這些是隨機訪問迭代器,這將執行單個分配等。
請注意,我從 更改span<T> const&為span<T const>,原因有兩個。首先,您沒有改變跨度的內容,因此內部型別需要const......類似于您采用 a 的方式T const*,而不是 a T*。其次,您應該span按價值獲取 s,因為它們復制起來很便宜(除非您非常特別需要跨度的標識,而您在這里不需要)。
這樣做可能會更好,這樣reinterpret_cast您就可以使用(char const*, size_t)建構式 - 這個可以確保memcpy最終寫入的唯一性。但是你必須花時間看看它是否值得。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419328.html
標籤:
上一篇:如何防止用戶在c 中輸入字串
下一篇:如何從二進制流中讀取單個位元組?
