【问题标题】:Rules/Guides for using C++ STL safely安全使用 C++ STL 的规则/指南
【发布时间】:2023-03-22 10:39:01
【问题描述】:

我正在学习 C++ STL,但不确定如何安全使用 STL。

例如一件事,我经常发现自己正在使用容器,而没有做if (!container.empty())。看似微不足道的事情,却是bug的来源。

是否有任何关于如何安全使用 STL 的规则或指南?

编辑:到目前为止,我找到了一个这样的指南JSF Air Vehicle - C++ Coding Standards - Joint Strike Fighter,但它现在似乎已经过时了(或者至少没有更新,尽管大多数规则都适用于今天)

【问题讨论】:

标签: c++ exception c++11 stl containers


【解决方案1】:

你可以阅读 Effective STL。

您通常应该编写无需检查即可工作的代码,而不是检查空容器。

许多实现都有调试模式来标记使用错误。了解你的库提供了什么。还有一些接口被指定为选中状态,比如.at()而不是索引操作符。

【讨论】:

  • 酷,不知道库有调试模式。
  • @newprint:公平警告,标准库的调试模式可以大大改变程序的运行时间;对于最昂贵的支票,20 倍的系数并非闻所未闻。
  • @newprint:您的主要收获应该是“您通常应该编写无需检查即可工作的代码,而不是检查空容器。”恕我直言..
【解决方案2】:

这里有一些编码指南,使container.empty() 检查大多是多余的

  • 正确初始化您的容器,最好使用初始化列表。这将使您有一个良好的开端和一个非空容器:-)
  • 如果您需要使用输入流中的值填充容器,请使用std::back_inserter(序列容器)或std::inserter(关联容器)。这将负责正确扩展您的容器。
  • 如果您需要处理容器,最好使用接受容器迭代器的标准库算法。这些算法在空输入时表现良好。
  • 如果您需要编写自己的算法,请使用容器迭代器begin()end(),并确保空容器被it != end() 之类的语句捕获。这将避免在空容器上出现pop_back()erase() 之类的内容。
  • 手写修改算法可以运行到iterator invalidation。确保您了解这些规则。

最后的项目可能是最难做到的。您确实希望尽可能通用地编写算法,以便在没有特殊外壳的情况下自然地包含空案例。

Scott Meyers 的Effective STL 是标准库初级/中级用户的推荐指南。

【讨论】:

    【解决方案3】:

    根据我的经验,这里有一些:

    • 遍历容器时使用const_iterator,无需修改任何元素
    • 如果使用[] 运算符来访问顺序包含的元素,总是首先验证数组边界
    • 不要在遍历容器时向容器添加/删除元素,除非您知道自己在做什么
    • 在使用容器的设计中,对函数建模以接受迭代器而不是容器本身。这样,您的代码可能会更加通用。

    我记得他们会添加更多。

    【讨论】:

    • 如果你打算使用 [] 运算符和额外的边界检查,那么为什么不使用 at() 方法呢?
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2011-07-13
    • 2020-07-07
    • 2020-06-19
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多