鉴于c ++许多程序员提供的新工具集,旨在实现代码简化,表达性,效率,浏览旧代码并进行调整(有些无意义,有些成功)以实现他们的目标.尽管不要在这些工作上浪费太多时间,只是做出非侵入性和自包含的变化,但最佳做法是什么?
让我勾勒出明显的:
使用auto运行基于迭代器的循环:
for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;
++it);
// becomes
for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
Run Code Online (Sandbox Code Playgroud)使用tie来进行多个赋值,这些赋值只产生C风格的代码行(如何一次将多个值分配到结构中?)
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
// becomes
std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)要使类不可继承,只需将其声明为"final"并删除实现此类行为的代码http://www.parashift.com/c++-faq/final-classes.html
使用delete关键字显式隐藏构造函数/析构函数,而不是将它们声明为私有(例如,用于创建基于堆的对象的代码,不可复制的对象等)
创建简单的仿函数只是为了将单个STL算法的执行变为lambda函数(除了减少代码混乱,你还能保证内联调用)
仅使用智能指针简化对象的RAII包装
摆脱bind1st,bind2nd只需使用bind
用<type_traits>提供的标准代码替换类型特征的手写代码(Is_ptr_but_dont_call_for_const_ptrs <>等:))
停止包含现在在STL中实现的函数的boost标头(BOOST_STATIC_ASSERT vs static_assert)
为类提供移动语义(虽然这不符合脏/快/易更改的条件)
在可能的情况下使用nullptr而不是NULL宏,并删除填充指针的容器的代码,其中0已转换为对象类型
std::vector<foo*> …Run Code Online (Sandbox Code Playgroud)我的输出是20个随机1,而不是10和1之间,任何人都可以解释为什么会发生这种情况?
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand((unsigned)time(0));
int random_integer;
int lowest=1, highest=10;
int range=(highest-lowest)+1;
for(int index=0; index<20; index++){
random_integer = lowest+int(range*rand()/(RAND_MAX + 1.0));
cout << random_integer << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我需要此代码生成一个介于5和8之间的数字,然后将其分配给变量.然而,当我让它只给我一个数而不是多个时,它只给我相同的数字.当我将它设置为e倍数时,它会给我随机数.
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(5, 8);
for (int n=0; n<1; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)