注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

C++11 中那些我喜欢的部分  

2012-02-04 10:36:12|  分类: lang_c/c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://en.wikipedia.org/wiki/C%2B%2B0x


不要用 std::auto_ptr,此指针有问题,且在 C++11 中已经 deprecated


用 std::unique_ptr 替代 std::auto_ptr。

unique_ptr 只允许在当前域(scope)使用,使用完后,自动释放。

------------------------------------------------------

#include <memory>     // std::unique_ptr

using namespace std;


unique_ptr<int> myFactory(int value)

{

  return unique_ptr<int>(new int(value));

}


void printMe(unique_ptr<int> p)

{

}


int main(int argc, char *argv[])

{

  unique_ptr<int> p(new int(1));

  unique_ptr<int> q = p;  // error: no copy allowed


  p.reset(new int(3));

  

  printMe(myFactory(10)); // only factory func is ok

  return 0;

}

------------------------------------------------------  



std::shared_ptr, 基于 refcount 的智能指针

------------------------------------------------------

#include <memory>     // std::shared_ptr

#include <iostream>

using namespace std;


class MyFoo

{

public:

  MyFoo() { cout << "Ctor" << endl; }

  ~MyFoo() { cout << "Dtor" << endl; }


  void SayHello() { cout << "MyFoo::Hello" << endl; }

};

typedef shared_ptr<MyFoo> MyFooPtr;


void printMe(MyFooPtr p)

{

  cout << "printMe " << p.use_count() << endl;

  p->SayHello();

}


int main(int argc, char *argv[])

{

  MyFooPtr pFoo(new MyFoo);

  cout << "main " << pFoo.use_count() << endl;

  printMe(pFoo);

  return 0;

}

------------------------------------------------------

Ctor

main 1

printMe 2

MyFoo::Hello

Dtor

------------------------------------------------------



用了 shared_ptr 会带来循环引用的问题。请配合 weak_ptr 来规避。

shared_ptr + weak_ptr 虽然是半自动的手段,但比 raw 的方式还是好多了。

------------------------------------------------------

#include <memory>

#include <iostream>

using namespace std;


int main(int argc, char *argv[])

{

  shared_ptr<int> p(new int(10));

  weak_ptr<int> q = p;


  shared_ptr<int> curr = q.lock();

  if (curr)

    cout << *curr << endl;

  return 0;

}

------------------------------------------------------



nullptr, 指针有了自己独立的 keyword

------------------------------------------------------

#include <iostream>

using namespace std;


class MyFoo {};


int main(int argc, char *argv[])

{

  MyFoo *p = new MyFoo;

  MyFoo *q = nullptr;

  cout << "p: " << p << endl;

  cout << "q: " << q << endl;

            

  const char * const str = (q == NULL) ? "nullptr == NULL" : "nullptr != NULL";

  cout << str << endl;


  delete p;

  return 0;

}

------------------------------------------------------



标准库支持 regex

------------------------------------------------------

#include <regex>

#include <iostream>


int main(int argc, char *argv[])

{

  std::regex rgx("[ ,.\\t\\n;:]");

  std::cmatch match;

  if (std::regex_search("hello:good,bad", match, rgx))

  {

    const size_t n = match.size();

    for (size_t i = 0; i < n; i++)

    {

      std::string str(match[i].first, match[i].second);

      std::cout << str << std::endl;

    }

  }

}

------------------------------------------------------



学习动态语言,库级别上引入 tuple 概念。虽然比 pair 好了一些,但写起来还是有些繁琐

------------------------------------------------------

#include <tuple>

#include <string>

#include <iostream>


typedef std::tuple<int, char, std::string> MyRecord;


int main(int argc, char *argv[])

{

  // python

  // record = (1, 'c', "hello")

  // print record[0], record[1], record[2]

  MyRecord record(1, 'c', "hello");

  std::cout << std::get<0>(record) << std::endl;

  std::cout << std::get<1>(record) << std::endl;

  std::cout << std::get<2>(record) << std::endl;

}

------------------------------------------------------



std::array(fixed size),顺便演示下 lambda func 的用法。

------------------------------------------------------

#include <array>

#include <iostream>


int main(int argc, char *argv[])

{

  std::array<int,5> intArray = {1,2,3,4,5};

  std::for_each(intArray.begin(), intArray.end(), [](int val) { std::cout << val << std::endl; });

}

------------------------------------------------------



多线程支持虽然进入标准了,但 VS2010 还未支持。

#include <thread>

...

  评论这张
 
阅读(1267)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017