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會分析到。