![](/img/trans.png)
[英]Simplest way to read binary data from a std::vector<unsigned char>?
[英]vector <unsigned char> vs string for binary data
哪個是用於保存和訪問二進制數據的更好的c ++容器?
std::vector<unsigned char>
要么
std::string
一個比另一個更有效嗎?
一個更“正確”的用法嗎?
你應該更喜歡std::vector
不是std::string
。 在通常情況下,兩個解決方案幾乎都是等效的,但是std::string
s是專為字符串和字符串操作而設計的,這不是您的預期用途。
兩者都是正確的,同樣有效。 使用其中一個而不是普通數組只是為了簡化內存管理並將它們作為參數傳遞。
我使用vector是因為意圖比使用string更清晰。
編輯: C ++ 03標准不保證std::basic_string
內存連續性。 然而,從實踐的角度來看,沒有商業非連續的實現。 C ++ 0x設置為標准化該事實 。
一個比另一個更有效嗎?
這是一個錯誤的問題。
一個更“正確”的用法嗎?
這是正確的問題。
這取決於。 如何使用數據? 如果您要使用像fashon這樣的字符串中的數據,那么您應該選擇std :: string,因為使用std :: vector可能會混淆后續的維護者。 另一方面,如果大多數數據操作看起來像普通數學或矢量,那么std :: vector更合適。
這是對運動答案的評論。 我把它寫成一個能夠格式化代碼的答案。
這是char_traits比較函數,行為非常健康:
static bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
template<typename _CharT>
int
char_traits<_CharT>::
compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
{
for (std::size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
最長的時間我在這里同意了大多數答案。 然而,就在今天,它讓我覺得為什么在std::vector<unsigned char>
上實際使用std::string
可能更明智。
大多數人都同意,使用其中任何一個都可以正常工作。 但通常情況下,文件數據實際上可以是文本格式(現在更常見的是XML已成為主流)。 這使得在調試器變得相關時可以很容易地在調試器中查看(並且這些調試器通常會讓您無論如何都可以導航字符串的字節)。 但更重要的是,許多可用於字符串的現有函數可以很容易地用於文件/二進制數據。 我發現自己編寫了多個函數來處理字符串和字節數組,並意識到這一切都是毫無意義的。
就可讀性而言,我更喜歡std :: vector。 在這種情況下,std :: vector應該是默認容器:意圖更清晰,正如其他答案已經說過的那樣,在大多數實現中,它也更有效。
有一次,我確實更喜歡std :: string而不是std :: vector。 讓我們看一下C ++ 11中移動構造函數的簽名:
string(string && str) noexcept ;
那次我真的需要一個noexcept移動構造函數。 std :: string提供它而std :: vector不提供它。
如果您只想存儲二進制數據,可以使用優化空間分配的bitset
。 否則請使用vector
,因為它更適合您的使用。
比較這2並選擇你自己哪個更具體。 兩者都非常強大,使用STL算法...選擇自己對您的任務更有效
我個人更喜歡std :: string,因為當我希望我的二進制緩沖區恢復為C兼容形式時,string :: data()對我來說更直觀。 我知道向量元素保證連續存儲在代碼中執行此操作感覺有點令人不安。
這是個人開發人員或團隊應該為自己做出的風格決策。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.