0.可变数量参数,可变函数模版,变长模版类

  • c++98可变数量参数

#include<cstdio>
#include<cstdarg>
double SumOfFloat(int count, ...)
{
va_list ap;
double sum=;
va_start(ap,count);
for(int i=;i<count;i++)
sum+=va_arg(ap,double);
va_end(ap);
return sum;
}
int main()
{
printf("%f\n",SumOfFloat(,1.2f,3.4,5.6));
return ;
}
  • 可变函数模版

#include<iostream>
#include<stdexcept>
using namespace std;
void Print(const char *s)
{
while(*s){
if(*s=='%'&&*++s!='%')
throw runtime_error{"missing arguments"};
cout<<*s++;
}
}
template<typename T,typename...Args>
void Print(const char*s,T value,Args...args)
{
while(*s)
{
if(*s=='%'&&*++s!='%')
{
cout<<value;
return Print(++s,args...);
}
cout<<*s++;
}
throw runtime_error{"extra arguments provided to Print"};
}
int main()
{
Print("hello %s\n",string("world"));
return ;
}
  • 变长模版类

#include<iostream>
using namespace std; template<long...nums> struct Multiply; template<long first,long ...last>
struct Multiply<first,last ...>
{
static const long val=first*Multiply<last...>::val;
};
template<>
struct Multiply<>
{
static const long val=;
};
int main()
{
cout<<Multiply<,,,>::val<<endl;
cout<<Multiply<,,,,>::val<<endl;
return ;
}

1.C++11原子类型

在并行编程、多线程编程中,对于共享资源的访问,需要通过添加互斥锁的方法来保证正确性。在POSIX标准下,pthread库,我们用lock方法来实现,如下:

pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER;

void* func(void*)
{
long long i;
for(i=;i<;i++)
{
pthread_mutex_lock(&m);
total+=i;
pthread_mutex_unlock(&m);
}
}

而在c++11中,我们通过定义的原子类型即可很方便地实现。c++11定义很多原子数据类型,比如:atomic_bool,atomic_char,atomic_int等等。

//total定义为原子类型,c++11中不需要为原子类型声明互斥锁
atomic_llong total{};
void func(int)
{
for(long long i=;i<;i++)
total+=i;
}

2.内存模型,顺序一致性与memory_order

太复杂,主要是硬件平台下内存读写顺序一致性.在c++11中,实现了很多内存顺序的细节,比如顺序一致、松散、release-require、release-consume四种顺序模型。

3.线程局部存储

本节省略…….

4.指针空值

在良好的编程习惯中,声明一个变量时,同时初始化,在以前的习惯里,如果声明指针,一般初始化为0或NULL。

其中NULL为宏定义,在stddef.h中可见细节,一般被定义为0或(void*)常量。

在c++11中,定义了一个指针空值类型的常量:nullptr,大小和void*一致。另有nullptr_t常量。

5.默认函数的控制

在c++中声明自定义类,编译器会自动生成默认函数:构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动拷贝函数、析构函数。

还会自动生成默认操作符:operator,,operator&,operator&&,operator*,operator->,operaotr->*,operator new,operator delete.

在以前的c++编程规则中,如果我们指定带参数的构造函数,则需要重写不带参数,即默认构造函数。

class TwoCstor
{
//提供了带参数的构造函数,则必须自行提供不带参数的版本
public:
TwoCstor(){};
TwoCstor(int i):data(i){};
private:
int data;
}

在C++11中,通过default关键字来实现这个目标。如下:

class TwoCstor2
{
//提供了带参数的构造函数,再指示编译器提供默认版本
public:
TwoCstor2()=default;
TwoCstor2(int i):data(i){};
private:
int data;
}

在实现Singleton模式中,我们需要将拷贝构造函数设为私有,在c++11中则更简单,直接利用deleted关键字,指示编译器不生成函数的默认版本。

#include<type_traits>
#include<iostream>
using namespace std;
class NoCopyCstor
{
public:
NoCopyCstor()=default;
//通过使用"=delete"有效阻止用户错用拷贝构造函数
NoCopyCstor(const NoCopyCstor &)=delete;
};
int main()
{
NoCopyCstor a;
NoCopyCstor b(a);//无法通过编译
}

6.lambda函数

lambda函数的语法定义如下:

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

使用lambda函数作为stable_sort函数的调用对象。

int main()
{
vector<string> strVec{"hello","wo","panzg1","at3","binary_function"};
stable_sort(strVec.begin(),strVec.end(),
[](const string &a,const string &b){return a.size()<b.size();});
for(auto e : strVec)
cout<<e<<endl;
}

code…各种各样的lambda函数

捕获列表的常见几种形式:

  • [var] 值传递捕获var
  • [=]值传递方式捕获所有父作用域的变量,包括this
  • [&var]引用传递捕获var
  • [&]引用传递捕获所有父作用域的变量,包括this
  • [this] 值传递方式捕获当前this指针

值传递、引用传递可以混用,比如[=,&a,b]等等。

仿函数,functor,函数对象,就i是重定义了成员函数operator()的一种自定义类型对象。比如在下面的例子中,test不是一样函数,而是一个对象。仿函数广泛地被用在STL中,在c++11中lambda也要被广泛使用。

#include<iostream>
class _functor
{
public:
int operator()(int x,int y) {return x+y;}
};
int main()
{
_functor test;
int x=,y=;
std::cout<<test(,);
}

事实上,仿函数是编译器实现lambda的一种方式,在现阶段,通常编译器会把lambda函数转化为一个仿函数对象。

关于lambda和STL的联系,它使得STL的算法使用更加方便,比如for_each,其原型是:

UnaryProc for_each(InputIterator beg,InputIterator end,UnaryProc op)

for_each算法第三个参数是一个单个参数的“函数”,即一个函数指针、仿函数或者lambda函数。

函数指针方法的缺陷是:往往定义在别的地方,阅读代码不方便;如果不进行inline优化,性能就比lambda函数差很多。而且函数指针的应用范围小很多,相比函数指针、仿函数,lambda函数往往是最佳的选择。

注:在c++98中,STL帮助我们定义了很多仿函数可直接使用。

[C++11新特性]第二篇的更多相关文章

  1. C++11新特性总结 (二)

    1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...

  2. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  3. C++11新特性之一——Lambda表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...

  4. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  5. C++11新特性总结 (一)

    1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...

  6. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  7. C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)

    这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr). shared_ptr shared_ptr 基本用法 shared_ ...

  8. C++11新特性— auto 和 decltype 区别和联系

    一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题,C++11新标准 ...

  9. c++ 11 线程池---完全使用c++ 11新特性

    前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ...

随机推荐

  1. jdbc 模板 连接

    package itcast; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;i ...

  2. win732 安装hadoop

    windows下安装hadoop http://www.cnblogs.com/coder2012/archive/2013/05/25/3096631.html硬盘格式应为NTFS1 下载安装 Cy ...

  3. visual C++ & Makefile

    Makefile说明: visual c++ 不通过IDE有3中方式对工程进行编译链接. 1.MSBuild 编译链接(IDE就是使用MSBuild,需要工程的.vcxproj和.filters文件) ...

  4. tp框架知识 之(链接数据库和操作数据内容)

    框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写con ...

  5. Error -27728: Step download timeout (120 seconds)的解决方法(转)

    LR中超时问题解决方法 超时错误在LoadRunner录制Web协议脚本回放时超时经常出现. 现象1:Action.c(16): Error -27728: Step download timeout ...

  6. java常用的基础容器

    1 Vector and ArrayList 它们都是可以随机访问的.它们的区别是Vector是线程安全的,而ArrayList不是线程安全的. 2 HashMap的底层实现机制 2.1 底层数据结构 ...

  7. SVM怎样解决多分类问题

    从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器.即它仅仅回答属于正类还是负类的问题.而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定"是&q ...

  8. Java for LeetCode 128 Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  9. PAT 乙级 1085. PAT单位排行 (25) 【结构体排序】

    题目链接 https://www.patest.cn/contests/pat-b-practise/1085 思路 结构体排序 要注意几个点 它的加权总分 是 取其整数部分 也就是 要 向下取整 然 ...

  10. Algorithm: inversion

    inversion就是逆序对 题目:现给出一个数列,求该数列中的逆序对数(逆序数).本节给出三种方法:方法一是最直接的暴力方法:方法二是基于归并分治的思想:方法三是基于线段树的.   [解法一] 暴力 ...