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