C++ 11的一些新特性(1)

最近学习了一下C++11的新特性,发现c++的进步很快,已经不在是我最早认识的那个c++了。

我的感觉是c++的更新的三个方向:

  1. 一个是语法层面上的
    语法层面上面应该是借鉴了像python语言这样的语法,比如for -each,auto 等这样的“语法糖”。

  2. STL / 第三方库 下面的更新
    比如加入unorder_map / set 等
    thread库,之前c++在window下和linux创建线程的api完全不一样,但是c++11之后,可以使用头文件thread,基本上统一了跨平台的问题。我觉得这个很好。

  1. c++核心的更新
    比如加入智能指针,functional,lambda函数,右值引用等

1. 指针指针
2. lambda 函数
3. STL unorder_map/set
4. funtion

function的机制有点像python里面 的传递一个函数。

#include <iostream>
#include <list>
#include <functional>
using namespace std;

int print_func(int val1, float val2) {
    cout << "val1 + val2 : " << val1 + val2 << endl;
    return val1 + val2;
}

int print_func2() {
    cout << "print_func" << endl;
    return 1;
}

int main()
{
    //function 有点像python里面 的传递一个函数
    function<int(int, float)> fun_name(print_func);  //参数是在这里是不可以带的
    int ret = fun_name(10, 20.0);                    //在调用的时候才可以调用
    cout << ret << endl;


    //使用function 实现任务队列
    list<function<void(void)>> task_list;
    //添加任务
    for (int i = 0; i < 10; i++) {
        function<void(void)> task(print_func2);
        task_list.push_back(task);
    }
    //拿任务干活
    while (!task_list.empty()) {
        function<void(void)> cur_task = task_list.front();
        task_list.pop_front();
        cur_task();
    }


    //上面的那个例子是不带参数的,实现一个带参数的版本
    list<function<int(void)>> task_list2;
    //添加任务
    for (int i = 0; i < 10; i++) {
        function<int(void)> task = bind(print_func, i, float(i * 2));  //使用bind将参数绑定
        task_list2.push_back(task);
    }
    //拿任务干活
    while (!task_list2.empty()) {
        function<int(void)> cur_task = task_list2.front();
        task_list2.pop_front();
        cur_task();
    }
}
5. bind函数 / 仿函数 / 占位符

这个有点像python里面的高阶函数的东西,就是把函数作为一个参数进行传递。

下面几段代码,可以理解一下

  • 代码1
    下面的下划线表示占位符,_1 表示的是函数的参数是不确定的,后面传递什么就是什么。
using namespace std::placeholders;

int mutiply(int a, int b) {
  return a * b;
}

int main() 
{ 
  auto f = bind(mutiply, 5, _1);
  for (int i = 0; i<10; i++) {
      cout << "5*" << i << "=" << f(i) << endl;
  }
}
  • 代码2
    这里分别有三个占位符,是_1 ,_2 ,_3 。
    _1 表示的是表示函数传递过来的第一个参数,_2表示函数传递过来的第二个参数,_3表示函数传递过来的第三个参数。
using namespace std::placeholders;

void show(const string& a, const string&b, const string&c) {
  cout << a << ":" << b << ":" << c << ";" << endl;
}

int main() 
{ 
  auto x = bind(show, _1, _2, _3); 
  auto y = bind(show, _2, _3, _1); 
  auto z = bind(show, "hello", _2, _1); 

  x("one", "two", "three"); 
  y("one", "two", "three"); 
  z("one", "two");

  return 0;
}

输出:
one:two:three;
two:three:one;
hello:two:one;

代码3:

#include <functional>
#include <iostream>
#include <string> 
#include <vector> 
using namespace std; 
void excute(const vector<function<void ()>>& fs) 
{ 
  for(auto&f:fs)
  { f(); } 
} 

void plain_old_func()
{ 
  cout<<"I'am old plain"<<endl; 
}

class functor
{ 
  public: 
  void operator()() { 
      cout<<"I'am a functor"<<endl; 
  } 
}; 

int main() 
{ 
  vector<function<void()>> x; 
  x.push_back(plain_old_func); 
  functor instance; 
  x.push_back(instance); 
  x.push_back([](){ cout<<"HI,I am lamda expression"<<endl; }); 
  excute(x); 

  system("pause");
  return 0; 
} 

代码4

#include <iostream>
#include <functional>
#include <memory>
#include <thread>
using namespace std;

class A
{
public:
  int Func(int x, int y)
  {
      return x + y;
  }
  void testfunc(void) {
      cout << "wahahah" << endl;
  }
};
int main() {
  A a;
  //知识点1 : 
  //bf2把一个类成员函数绑定了类对象,生成了一个像普通函数一样的新的可调用实体
  auto bf2 = std::bind(&A::Func, a, std::placeholders::_1, std::placeholders::_2);
  cout << bf2(10, 20); ///< same as a.Func(10, 20)  


  //知识点2 :
  //以std::make_shared<thread> 的方式去执行函数
  auto f = std::bind(&A::testfunc, a);
  auto res = std::make_shared<thread>(f);
  
  system("pause");
  return 0;
}

代码5

class B {
public:
  
  void start() {
      auto res = std::bind(&B::testfunc, *this);
      //auto res = std::bind(&B::testfunc, this);   //这里加不加 * 都可以
      //执行testfunc ,方式1 :
      res();

      //执行testfunc ,方式2 :
      //auto res2 = std::make_shared<thread>(res);
  }
  
  void testfunc(void) {
      cout << "wahahah" << endl;
  }
};

int main(){
  B b;
  b.start();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容