1. 程式人生 > >條目十三《盡量使用vector和string來代替使用數組》

條目十三《盡量使用vector和string來代替使用數組》

廣泛 轉換 直接 而且 做的 多余 需要 切片 元素

條目十三《盡量使用vector和string來代替使用數組》

數組在現代編程語言中基本都存在,應用可謂廣泛,不可或缺,雖然在一些語言中(go)有切片等數據結構,但是數組還是存在的。

但是在有了stl後,在使用數組時更建議用vector和string來代替,因為在動態分配數組的內存時,需要人為的管理內存。比如在new T[]時,需要在用完分配的數組後先手工釋放數組存放的對象,然後再釋放數組的內存

直接使用數組的不好之處有:

  • 在很多時候,如果程序運行時在動態分配數組內存後產生異常,那麽就不會調用析構數組裏的對象和釋放內存,造成內存泄露。
  • 數組不是根據存放元素動態增長的,所以在動態分配內存的時候很難把握分配內存的大小。而vector和string裏頭是分配子allocator
    來動態維護vector和string的內存空間的。

new T[...]
當T是char時有兩種選擇,其他時候用vector和string代替數組的選擇是比較明確的,所以這裏主要說說當T是char的情況。

new char[...]時可以用vector

string在底層的實現大多的廠商是實現了多線程安全的,一般是使用引用計數方法。所以在使用string的時候,不用擔心線性安全的問題。但是如果你的生產環境不需要考慮線性安全的,string為了保證線性安全所做的工作就是多余的。

在這裏,有幾種方法可以修改string是非線性安全的:

  • 1.查找廠商的文檔資料,因為string的引用計數保證線性安全是一個優化,所以一般會重點標出的。而且一般有一個宏定義來開關。
  • 2.自己追蹤源碼,這裏註意string只是basic_string
  • 3.使用vector。這一點就是上面說到的特殊情況。

如果想把老代碼的接口的形參是數組的,而現在是想傳其他容器進去,在這裏也有辦法,可以先把其他容器轉換為vector或string,然後再傳進去。過多的分析在後面的條目16會分析到。

條目十三《盡量使用vector和string來代替使用數組》