2

我正在学习 C++ STL,但不确定的一件事是如何安全地使用 STL。

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

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

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

4

3 回答 3

3

您可以阅读有效的 STL。

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

许多实现都有调试模式来标记使用错误。了解你的库提供了什么。此外,某些接口被指定为已检查,例如.at()代替索引运算符。

于 2013-10-03T05:10:29.913 回答
2

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

  • 正确初始化您的容器,最好使用初始化列表。这将使您有一个良好的开端和一个非空容器:-)
  • 如果您需要使用输入流中的值填充容器,请使用std::back_inserter(序列容器)或std::inserter(关联容器)。这将负责正确扩展您的容器。
  • 如果您需要处理容器,最好使用接受容器迭代器的标准库算法。这些算法对于空输入表现得很好。
  • 如果您需要编写自己的算法,请使用容器迭代器begin()end()并确保空容器被it != end(). 这将避免像pop_back()erase()在空容器上的东西。
  • 手写修改算法可能会遇到迭代器失效。确保您了解这些规则。

最后的项目可能是最棘手的。您真的想尽可能地编写您的算法,以便在没有特殊外壳的情况下自然地包含空案例。

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

于 2013-10-03T09:10:19.053 回答
1

以下是一些,根据我的经验:

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

当我记得他们时会添加更多。

于 2013-10-03T05:03:00.117 回答