Algorithms + Data Structure = Programs

算法 + 数据结构 = 程序

数量不定的模板参数(variadic templates)

(Since C++11)

template <typename T, typename... Types>//类型...
void print(cosnt T& firstArg, const Type&...args){}//将参数分为一个和一包

…就是所谓的pack(包)

  • 用于template parameters就是template parameters pack(模板参数包)
  • 用于function parameter types就是function parameter types pack(函数参数类型包)
  • 用于function parameter就是function parameters pack(函数参数包)
    在这里插入图片描述
    当包里最后一个42传入firstArg,则包里参数个数为0(因为下面输出firstArg,包里的每个参数依次传到firstArg,直到最后一个)
    使得void print(const T& firstArg,const)无法被调用
    下面的print调用的不是void print(const T& firstArg, const Type&…args)而应该重新写一个void print()与它并存

auto (since C++11)

list<string> c;//容器list,容器内的每个元素都是一个字符串
...
list<string>::iterator ite;//迭代器ite的类型是list<string>::iterator
ite = find(c.begin(),c.end(),target);
list<string> c;
...
//迭代器ite像指针那样,它指向find内的参数,find是算法
//返回类型auto这里等价于list<string>::iterator
auto ite = find (c.begin(), c.end(), target);
//错误写法
//auto ite;
//ite=find(c.begin(), c.end(), target);

ranged-base for范围for语句(since C++11)

for (decl : coll ){  //变量 : 容器
	statement
}

举例:

for ( int i : { 2, 3, 5, 7, 9, 13, 17, 19 } ){
		cout << i << endl;//容器中的值依次赋给i,并依次打印出
}

简化:

vector<double> vec;//容器内的元素均为double类型,容器名称vec
...
for ( auto elem : vec ) {		//传值
		cout << elem <<endl;
}
for ( auto& elem : vec ) {		//传引用
		elem *= 3;
}

传值

for ( auto elem : vec ){  //elem将容器vec中的元素逐一取出复制到elem,取一个输出一个.
		cout << elem << endl;//如果3乘以elem,也不会影响vec内的元素的内容
//乘以3影响的是紫色边框的方块
}

传引用

for ( auto& elem : vec ) { //传引用相当于传指针
		elem *= 3;//紫色的elem乘以3,影响vec中的元素的内容
}

笔记来源:
https://www.bilibili.com/video/BV1cb411B7b9?p=14

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐