TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2009年2月6日 星期五

Choise of byte array container

最近需要在函式回傳一個容納二進位資料的陣列,以供C的函式庫使用,因此它最好是在儲存空間上連續,在頭尾加入或刪除資料很快速[?],並且可以隨機存取。
我第一個想到的是std::string。它是一個底部連續的容器,支援隨機存取,可快速在尾端插入或刪除元素,甚至提供了data()函式取得底部資料,似乎很完美。不過我顧慮的有兩點,一是結束字元的判斷--它會不會把'\0'當成字串結束就打亂了字串狀態呢?二是它多了一些其實不需要的字串處理介面。
那麼std::vector怎麼樣?它具有std::string的所有優點,而沒有它的缺點,似乎是個不錯的選擇。要說它唯一缺點就是,在開頭插入或刪除元素的速度很慢。
那麼再看看其他的容器吧,也許std::list?它在頭尾插入很快--事實上它在任何一點都很快,不過它有其他的缺點--它的底部不連續,這讓你要以陣列方式傳給C函式時需要額外的手續。另外不支援隨機存取也會多一些麻煩,以及比較不明顯的問題....list node空間佔用。如果應用並不需要時常存取整段資料,應該會是個好選擇。
到這裡只剩下一個不太常看到的標準容器了--std::deque。它可以隨機存取,在頭尾可以很快速地新增或移除元素,只是它不保證底部會連續儲存。看起來好像是std::vector加上std::list再取平均的特性。
目前我的選擇是std::deque,因為我覺得在大量資料的操作下,std::list似乎會比較慢。實際上可能還要看實作吧。

2 則留言:

  1. 這個問題也困擾我一段時間,後來我還是用char* XD

    回覆刪除
  2. 就是懶得再自己搞那堆空間XD

    後來覺得std::list真的很不適合用在這種用途上

    回覆刪除