首页 > 代码库 > C++11新特性实验

C++11新特性实验

#include <iostream>#include <vector>#include <map>#include <string>#include <algorithm>#include <utility>#include <tuple>#include <functional>#include <memory>using namespace std;void F(int a){	cout<<"int:"<<a<<endl;}void F(int *pa){	cout<<"int *:"<< pa <<endl;}void PrintVector(const vector<int> & vi){	cout<< "[";	for(auto it = vi.begin(); it != vi.end(); ++it){		cout<< *it <<",";	}	cout<< "]" <<endl;}struct Sum{	Sum(){sum=0;}	void operator()(int n){ sum += n; }	int sum;};template<typename T>void Print(T t){    cout<< t <<endl;  } template<typename Head, typename... Tail>  void Print(Head head, Tail... tail) {      cout<< head <<", ";      Print(tail...);  } class Foo{public:	Foo(){ cout<< "Foo construct."<< this  <<endl;}	~Foo(){ cout<< "Foo destruct."<< this <<endl; }	int val;	void bar(){ cout<< "Foo.bar() called."<< val <<endl; }};int main(){	/****************************************/	auto i = 12345678;	auto s = "Hello中国";	auto f = 3.14;	vector<int> vi {1,2,3,4};	decltype(f) d = 6.28;	PrintVector(vi);	cout<< i << endl;	cout<< s << endl;	cout<< f << endl;	// old style: vector<int>::iterator it = vi.begin()	cout<< endl;	cout << "decltype(x):"  << d <<endl;	/****************************************/	// NULL vs. nullptr	int a = 0;	int *pa = nullptr;	int *pb = NULL;	F(a);	F(pa);	F(pb);	bool bEqual = (pa == pb);	cout<< bEqual <<endl;	/****************************************/	// for_each	map<string,int> m1 {			{"Hello中国",110},			{"美国",345},			{"Japan",000}		};	for(auto item: m1){		cout<<"Key:"<<item.first<<",Value:"<<item.second<<endl;	}	for_each(vi.begin(),vi.end(),[](int & x){ x*=2; } );	PrintVector(vi); 	// Calls Sum::operator() for each number	Sum sum1 = for_each(vi.begin(),vi.end(),Sum());	cout<<"Sum:"<<sum1.sum<<endl;		int arg1=1,arg2=2;	for_each(vi.begin(),vi.end(),[=](int & x){ x *=(arg1+arg2); } );	PrintVector(vi);	for_each(vi.begin(),vi.end(),[=](int & x) -> int { return  x *(arg1+arg2); } );	PrintVector(vi);	/****************************************/	// 变长参数模板	auto pair1 = make_pair(110,"Hello中国");	cout<< "pair.first:"<<pair1.first<<",pair.second:"<<pair1.second<<endl;	auto tuple1 = make_tuple("Hello",1,3.14);	cout<< std::get<0>(tuple1) <<endl;	cout<< std::get<1>(tuple1) <<endl;	cout<< std::get<2>(tuple1) <<endl;	Print(1);	Print(1,"Hello中国");	Print(1,"Hello中国",3.1415926);	cout<< "******************************" <<endl;	// unique_ptr具有转移语义	unique_ptr<Foo> p1(new Foo());		if(p1) p1->val = 123;	if(p1) p1->bar();	{		unique_ptr<Foo> p2 = std::move(p1);		p2->val *=2;		p2->bar();	}	if(p1) p1->bar();	cout<< "******************************" <<endl;	// shared_ptr	shared_ptr<Foo> sp1(new Foo());		if(sp1) sp1->val = 123;	if(sp1) sp1->bar();	{		shared_ptr<Foo> sp2 = sp1;		sp2->val *=2;		sp2->bar();	}	if(sp1) sp1->bar();	return 0;}

 

C++11新特性实验