簡體   English   中英

安全使用C ++ STL的規則/指南

[英]Rules/Guides for using C++ STL safely

我正在學習C ++ STL,有一件事不確定是如何安全地使用STL。

例如,一件事,我經常發現自己正在使用容器,而沒有執行if (!container.empty()) 看起來很瑣碎,但卻是錯誤的來源。

是否有關於如何安全使用STL的規則或指南?

編輯:到目前為止,我發現了一個這樣的指南JSF Air Vehicle - C++ Coding Standards - Joint Strike Fighter ,但到目前為止似乎已經過時了(或者至少沒有更新,盡管大多數規則適用於這一天)

您可以閱讀有效的STL。

而不是檢查空容器,通常應編寫無需檢查即可運行的代碼。

許多實現具有調試模式,這些模式將標記使用錯誤。 了解您的lib提供的內容。 另外,某些接口也被指定為選中狀態,例如.at()而不是索引運算符。

這里有一些編碼准則,這些准則使container.empty()檢查大都是多余的

  • 正確地初始化您的容器,最好使用初始化器列表。 這將為您提供一個良好的開端和一個非空的容器:-)
  • 如果需要用輸入流中的值填充容器,請使用std::back_inserter (序列容器)或std::inserter (關聯容器)。 這樣可以正確擴展容器。
  • 如果您需要處理容器,則最好使用接受容器迭代器的標准庫算法。 對於空輸入,這些算法行為正常。
  • 如果需要編寫自己的算法,請使用容器迭代器begin()end()並確保一個空容器被類似it != end()的語句捕獲。 這樣可以避免在空容器上出現諸如pop_back()erase()類的事情。
  • 手寫修改算法可能會導致迭代器失效 確保您了解這些規則。

最后的項目可能是最棘手的項目。 您真的想盡可能通用地編寫算法,以便自然地將空情況包含在內,而無需特殊的大小寫。

對於標准庫的初級/中級用戶,建議使用Scott Meyers的有效STL

根據我的經驗,這里有一些:

  • 在遍歷容器時使用const_iterator而無需修改任何元素
  • 如果使用[]運算符訪問順序包含中的元素,請始終先驗證數組邊界
  • 遍歷容器時不要在容器中添加/刪除元素, 除非您知道自己在做什么
  • 在使用容器的設計中,對您的函數建模以接受迭代器,而不是容器本身。 這樣,您的代碼可能會更通用。

我記得他們會增加更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM