C++11

目录

1.可变参数模板

1.1概念

1.2参数包的展开

2.stl的emplace接口

3.lambda表达式

lambda表达式形式

demo代码

4.function包装器

5.bind包装器


1.可变参数模板

1.1概念

有了可变参数模板,可以创建任意参数的函数模板和类模板。

cpp 复制代码
template <class ...Args> // ...的位置,怎么规定就怎么用吧。。。。。。
int add(Args... arg)
{
	return 0;
}

int main()
{
	vector<int> v;
	string s;
	add(1, 3, 4, 5, 6);
	add(1,'c', v,s);
	return 0;
}

上述代码,直接生成解决方案是没有任何问题的。

1.2参数包的展开

cpp 复制代码
template<class T>
void show(T t)
{
	cout << t << endl;
}

template<class T, class ...Args>
void show(T t,Args... arg)
{
	cout << t << endl;
	show(arg...);
}

int main()
{
	vector<int> v;
	string s;
	show(1, 3, 4, 5, 6);
	cout << endl;
	return 0;
}

这个也不知道是哪个神人想出来的,大概思路就是,[1,3,4,5,6],第一次调用show将[1]传给t,[3,4,5,6]传给arg,第二次递归将[3]传给t,[4,5,6]传给arg,依次类推就将所有参数解包。

2.stl的emplace接口

这个也是c++11之后新添加的功能,他支持万能引用,指出可变参数

插入一个新的元素在vector的末尾元素的后面,这个新的元素是使用args为参数构造的。

cpp 复制代码
class date
{
public:
	date(int year = 2000, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout<< "date(int year = 2000, int month = 1, int day = 1)" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	vector<date> v;
	v.push_back({1999,3,3});
	//v.push_back(1999, 3, 3);错误做法
	v.emplace_back(1999,3,3);
	return 0;
}

v.push_back({1999,3,3});就是隐式类型转换,构造出一个date临时对象,在拷贝临时对象放入vector中。

v.emplace_back(1999,3,3);直接构造一个对象,放入vector中。

emplace接口对浅拷贝的类更有意义的,对于浅拷贝emplace可以减少一次拷贝构造。

但是对于深拷贝有移动构造的类,emplace减少一次移动构造,移动构造代价很小,效率提升不明显。

3.lambda****表达式

在c++98中,我们使用sort这类的接口,想要比叫大于或者是小于,必须自己写一个仿函数,非常的不人性,非常的麻烦。

cpp 复制代码
template<class T>
class compare
{
public:
	bool operator()(T left,T right)
	{
		return left > right;
	}
};

int main()
{
	compare<int> cmp;
	vector<int>a = {1,2,4,5,6};
	sort(a.begin(),a.end(),cmp);
	for (auto num : a)
	{
		cout << num << endl;
	}
	return 0;
}

在c++11中我们可以使用lambda表达式,代替仿函数。

lambda表达式形式

[ capture-list] (parameters) mutable -> return-type { statement }

**capture-list:**捕捉列表,用于捕捉参数,捕捉的参数是原参数的拷贝

var\]:表示值传递方式捕捉变量var \[=\]:表示值传递方式捕获所有父作用域中的变量(包括this) \[\&var\]:表示引用传递捕捉变量var \[\&\]:表示引用传递捕捉所有父作用域中的变量(包括this) \[this\]:表示值传递方式捕捉当前的this指针 **(parameters):**参数列表,和函数的参数列表一样。 **mutable:**关键字,lambda默认是const,mutbable可以取消const。 **return-type:**返回值值,可写可不写,lambda表达式会自动推导。 **{ statement }:**函数体 ### demo代码 ```cpp class goods { public: goods(string name = "未知", int price = 0) :_name(name) ,_price(price) {} string _name; int _price; }; int main() { vector v = { {"苹果",3},{"香蕉",6},{"栗子",1} }; sort(v.begin(), v.end(), [](goods& g1, goods& g2)->bool {return g1._price > g2._price; }); for(auto g : v) { cout << g._name << endl; } return 0; } ``` ![](https://img-blog.csdnimg.cn/direct/219a45dbcb714dbfa8d0423e9b57c66f.png) lamdba表达式的底层还是仿函数的,lamdba表达式是可以拷贝,但是不能赋值。 ```cpp int main() { auto lamdba1 = [] {cout << "hello word" << endl; }; auto lamdba2 = [] {cout << "hello word" << endl; }; lamdba1 = lamdba2; return 0; } ``` ![](https://img-blog.csdnimg.cn/direct/01e9768521a44c53af0e029713c55c23.png) 错误原因就是他们两个类型不同。 ## 4.function包装器 包装器是一个类模板,它可以用来接受,函数指针,函数对象,lamdba表达式。 ```cpp #include // 类模板原型如下 template function; // undefined template class function; ``` Ret是返回值,Args是函数参数。 demo代码 ```cpp int add(int a,int b) { return a + b; } class cadd { public: int operator()(int a, int b) { return a + b; } }; int main() { function func1 = add; cout< func2 = cadd(); cout << func2(2, 4)< func3 = [](int a, int b)->int { return a + b; }; cout << func3(2, 4) << endl; return 0; } ``` ## 5.bind包装器 bind是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来"适应"原对象的参数列表 。 主要就是有两个功能,改变参数位置,绑定参数。 ```cpp template bind (Fn&& fn, Args&&... args); ``` 参数fn接收一个函数,Args就是函数的参数。 ![](https://img-blog.csdnimg.cn/direct/255664930c934637be24bdcc1da70d8c.png) _1代表的就是函数第一个参数,_1是在placeholders这个类域里的。 参数绑定 绑定的位置,与函数参数位置对应。 ```cpp auto func3 = bind(sub,1,5); cout << func3 () << endl; ``` 成员函数的绑定 成员函数别忘记,this,每个成员函数都有一个this指针。 ```cpp auto func4 = bind(&csub::sub, csub(), placeholders::_1, placeholders::_2); cout << func4(1,7) << endl; ```

相关推荐
444A4E18 分钟前
C++模板:泛型编程的魔法手册,从入门到“魔改”
c++·编译原理
Chiyamin37 分钟前
C++面向对象速览(三)
c++
Tadecanlan42 分钟前
[C++面试] 智能指针面试点(重点)续4
开发语言·c++·面试
Chiyamin42 分钟前
C++面向对象速览(一)
c++
GOTXX1 小时前
BoostSiteSeeker项目实战
前端·c++·后端·mysql·搜索引擎·项目实战·boost
胡乱儿起个名1 小时前
C++的指针数组、数组指针和指针数组指针
开发语言·c++
姜行运1 小时前
数据结构【链表】
c语言·开发语言·数据结构·链表
长潇若雪2 小时前
《STL 六大组件之容器篇:简单了解 list》
开发语言·c++·经验分享·list·类和对象
君义_noip2 小时前
信息学奥赛一本通 1524:旅游航道
c++·算法·图论·信息学奥赛
学习同学3 小时前
C++进阶知识复习 1~15
java·开发语言·c++