zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Android的FileOutputStream中向文本文件中写入换行符
    简单又好看的按钮,扁平化按钮。
    android常见错误之 No resource found that matches the given name
    eclipse中Android模拟器,DDMS看不到设备
    Android软件开发之盘点所有Dialog对话框大合集
    Android软件开发之TextView详解
    frameset网页彻底退出或跳转(转)
    .Net 如何限制用户登录(转)
    将上传图片文件转成二进制流再存储
    数据库链接字符串自动生成
  • 原文地址:https://www.cnblogs.com/wucg/p/4089339.html
Copyright © 2011-2022 走看看