首先,一些经验法则:
使用std::unique_ptr
作为一个无开销的智能指针。您不必经常烦恼原始指针。std::shared_ptr
在大多数情况下同样是不必要的。首先,对共享所有权的渴望常常背叛了缺乏所有权的思想。
使用std::array
静态长数组和std::vector
动态。
广泛使用通用算法,尤其是:
<algorithm>
<numeric>
<iterator>
<functional>
使用auto
和decltype()
无论他们受益可读性。尤其是,当您要声明事物,但是您不需要关心的类型(例如迭代器或复杂的模板类型)时,请使用auto
。当您要根据其他事物的类型声明一个事物时,请使用decltype()
。
尽可能使类型安全。当您拥有对特定事物强制执行不变式的断言时,该逻辑可以集中在一种类型中。这并不一定会导致任何运行时开销。不用说,(T)x
应避免使用C样式的强制类型转换(),而应使用更显式(且可搜索!)的C ++样式的强制类型转换(例如static_cast
)。
最后,知道规则三:
通过添加move构造函数和move赋值运算符,已成为五个规则。并大致了解右值引用以及如何避免复制。
C ++是一种复杂的语言,因此很难描述如何最好地使用所有这些语言。但是,良好的C ++开发实践并没有从C ++ 11根本改变。与手动内存管理相比,您仍然应该首选内存管理的容器-智能指针使轻松高效地做到这一点。
我要说的是,现代C ++实际上基本上没有手动内存管理功能-C ++内存模型的优点是它是确定性的,而不是手动的。可预测的释放使性能更可预测。
对于编译器,G ++和Clang在C ++ 11功能方面都具有竞争力,并且迅速弥补了它们的不足。我不使用Visual Studio,所以我既不能支持也不可以反对。
最后,注意事项std::for_each
:一般情况下避免使用。
transform
,accumulate
和erase
- remove_if
是好老的功能map
,fold
和filter
。但是for_each
它比较笼统,因此意义不大- 除了循环外,它不表达任何其他意图。除此之外,它在与基于范围的情况下使用的情况相同for
,并且即使在无点使用的情况下,在语法上也较重。考虑:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);