1 粗看STL
程序=数据结构+算法
数据结构:容器Containers
算法:Algorithms
容器和算法在C++标准库中给了定义,要看懂,要会用,要常用。
2 C++11有助于使用的三个主题
2.1 variadic templates,数量不定的模板参数
语法:typename…,这三个点已经成为了语言的一部分。
void print()
{
}
template<typename T, typename... Types>
void print(const T& firstArg, const Type&... args)
{
cout<<firstArg<<endl;
print(args...);
}
print(7.5, "hello", bitset<16>(377), 42);
编译器理解上面代码的方式:print这个模板函数接受“两组”参数。第一组只有一个,即T,代码中是firstArg。第二组可以是任意个,个数有几个不知道。函数print递归调用自己,分为1个和其他这样处理。当第二组参数个数为0时,调用的就是上面第一行的print函数了。
…就是一个所谓的pack(包)
用于template parameters, 就是template parameters pack(模板参数包)
用于function parameter types, 就是function parameter types pack(函数参数类型包)
用于function parameters, 就是function parameters pack(函数参数包)
如果想知道一包是几个,可以在 variadic templates中, 关键字**sizeof…()**可以做到。
2.2 auto
不用管一个对象的类型,让编译器自己推理其类型。
list<string> c;
...
list<string>::iterator ite;
ite = find(c.begin(), c.end(), target);
为了方便,可以用auto
list<string> c;
...
auto ite = find(c.begin(), c.end(), target);//正确写法
auto ite; //错误写法
ite = find(c.begin(), c.end(), target);
可以说,如果每次声明的时候都赋值时,所有的变量都用auto是可以的,但不推荐初学者这样使用。
2.3 ranged_base for
遍历的情况下,for的循环中,有一种新的形式,一个单冒号。
for(decl : coll)//decl是一个变量,coll是一个容器
{
statement
}
将coll中的每一个元素,都依次copy或设定到左边的变量中,用于for的遍历。
使用如下:
for(int i : {2, 3, 5, 7, 9, 13, 17, 19})
{
cout<< i << endl;
}
vector<double> vec;
for(auto elem : vec)//pass by value
{
cout << elem << endl;
}
for(auto& elem : vec)// pass by reference
{
elem *= 3;
}
上面的后两个例子中,有pass by value和pass by reference两种形式。值传递就是浅层的拷贝;而引用传递是在底层直接进行修改,影响的是真正原来的东西。