STL中常用的c++语法
函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现。如果对某个class进行operator()重载,它就成为一个仿函数。
仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了
#include <iostream>
using namespace std; template<class T>
struct Plus
{
T operator()(const T& x, const T& y)const
{
return x + y;
}
}; template<class T>
struct Minus
{
T operator()(const T& x, const T& y)const
{
return x - y;
}
}; int main()
{
Plus<int>plusobj;
Minus<int>minusobj; cout << plusobj(, ) << endl;
cout << minusobj(, ) << endl; //以下直接产生仿函数的临时对象,并调用
cout << Plus<int>()(, ) << endl;
cout << Minus<int>()(, ) << endl; system("pause");
return ;
}
产生临时对象的方法:在类型名称后直接加一对小括号,并可指定初值
vector<int>() = {1};
。stl常将此技巧应用于仿函数与算法的搭配上。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; /*
template <class InputIterator,class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for (; first != last; ++first)
{
f(*first);
}
return f;
}
*/ template <typename T>
class print
{
public:
void operator()(const T& elem)
{
cout << elem << ' ' << endl;
}
}; int main()
{
int ia[] = { ,,,,, };
vector<int>iv(ia, ia + ); for_each(iv.begin(), iv.end(), print<int>()); system("pause");
return ;
}
静态常量整数成员在class内部直接初始化,否则会出现链接错误。
In C++11, non-
static
data members,static constexpr
data members, andstatic const
data members of integral or enumeration type may be initialized in the class declaration. e.g.struct X {
int i=5;
const float f=3.12f;
static const int j=42;
static constexpr float g=9.5f;
};In this case, the
i
member of all instances of classX
is initialized to5
by the compiler-generated constructor, and thef
member is initialized to3.12
. Thestatic const
data memberj
is initialized to42
, and thestatic constexpr
data memberg
is initialized to9.5
.Since
float
anddouble
are not of integral or enumeration type, such members must either beconstexpr
, or non-static
in order for the initializer in the class definition to be permitted.Prior to C++11, only
static const
data members of integral or enumeration type could have initializers in the class definition.
const
和 constexpr
变量之间的主要区别在于:const
变量的初始化可以延迟到运行时,而 constexpr
变量必须在编译时进行初始化。所有 constexpr
变量均为常量,因此必须使用常量表达式初始化。
对于修饰Object来说,const并未区分出编译期常量和运行期常量,constexpr限定在了编译期常量。
编译器常量的特点就是:它的值在编译期就可以确定。比如:const int i = 5;
在运行时常量,它的值虽然在运行时初始化后不再发生变化,但问题就在于它的初始值要到编译时才能确定。比如:
srand(clock());
const int i = rand();
虽然i的值在定义并初始化成不会再发生变化(除非你使用一些不符合标准的小技巧),但再聪明的编译器也无法在编译时确定它的值。
编译期常量最常见的例子是编译时的常数定义,比如:
const double PI = 3.1415926;
运行期常量的最常见的例子是函数的常量参数(包括常引用,常指针参数)比如:
void f(const string& s) {...}
次常见的例子是类的非静态常量成员。
——这些都是一经初始化,不允许再发生变化的,但其初始值必须到运行时才能知道。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; template <typename T>
class testClass
{
public:
static const int a = ;
static const long b = 3L;
static const char c = 'c';
static const double d = 100.1;
}; int main()
{
cout << testClass<int>::a << endl;
cout << testClass<int>::b << endl;
cout << testClass<int>::c << endl;
//下面的语句出错,带有类内初始值设定项的静态数据成员必须具有不可变的常量整型
cout << testClass<int>::d << endl; system("pause");
return ;
}
increment(++)实现(前置式及后置式),dereference(*)实现
i++调用operator++(int), ++i调用operator++()
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; class INT
{
friend ostream& operator<<(ostream& os, const INT& i);
public:
INT(int i) :m_i(i) {};
//自增然后得到值
INT& operator++()
{
++(this->m_i);
return *this;
}
//先得到值然后自增
const INT operator++(int)
{
INT temp = *this;
++(this->m_i);
return temp;
}
//取值
int& operator*() const
{
return (int&)m_i;
//下面的语句会出错,因为将int&类型的引用绑定到const int类型的初始值设定项。由于函数是const成员函数导致
//return m_i;
}
private:
int m_i;
}; ostream& operator<<(ostream& os, const INT& i)
{
os << '[' << i.m_i << ']' << endl;
return os;
} int main()
{
INT I();
cout << I++;
cout << ++I;
cout << *I; system("pause");
return ;
}
STL中常用的c++语法的更多相关文章
- 仿函数(二、stl中常用仿函数)
提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法.容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的 ...
- STL中常用容器及操作 学习笔记1
@[TOC](下面介绍STL中常见的容器及操作)## 不定长数组 vector> vetcor:其实就是一个数组或者说是容器 其操作不同于之前直接定义的数组 > 而且可以直接赋值也可以直接 ...
- 编码中常用的SQL语法
蓝色标注的都是比较常见的SQL ====================== 开发中常见的SQL: left join , right join 防止丢弃数据 inner join CASE WHNE ...
- STL中常用算法
一.排序 sort sort(first_pointer,first_pointer+n,cmp) 默认为升序 若要使用降序,自行写cmp 函数 bool cmp(int a,int b){ retu ...
- MATLAB中常用函数及语法
zeros() 1 zeros(n):n*n 全零矩阵 2 zeros(m,n):m*n全零矩阵 3 zeros(d1,d2,d3……dn):生成 d1*d2*d3*……*dn 全零矩阵或数组. 4 ...
- Vue--vue中常用的ECMAScript6语法
1.对象的写法 es5中对象: {add:add,substrict:substrict} es6中对象: {add,substrict} 注意这种写法的属性名称和值变量是同一个名称才可以简写,否则要 ...
- stl中常用的排序算法
#include"iostream" #include"vector" using namespace std; #include"string&qu ...
- C++ STL中的常用容器浅谈
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...
- 深入解析C++ STL中的常用容器
转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...
随机推荐
- select 1浅析
今天看到项目代码里有这条语句,不懂select 1 from XXXXXXX里的1是何意,查了一番才知道: 1.select 1 from mytable;与select anycol(目的表集合中的 ...
- Shorthand Argument Names $0 : 只用于指代Closer声明中的形参
Shorthand Argument Names Swift automatically provides shorthand argument names to inline closures, w ...
- Swift protocol extension method is called instead of method implemented in subclass
Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...
- 梦想CAD控件,用于浏览和编辑DWG文件,在脱离AUTOCAD的情况下独立运行,相当于简易CAD
(百度百科连接) 梦想绘图控件5.2 是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常 ...
- vue面试相关
(1)什么是mvvm? MVVM是Model-View-ViewModel的缩写.mvvm是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View ...
- (独孤九剑)--PHP简介与现况
(1)为什么学习PHP? 1.好就业: 2.入门简单,学习周期短,两个月即可: 3.学习编程思路,使编程习惯更加规范: 4.大公司直招: 5.处理大并发数据: 6.开源,所以更加安全 (2)PHP是什 ...
- Js获取操作系统版本 && 获得浏览器版本
//利用原生Js获取操作系统版本function getOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.plat ...
- vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改
vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...
- 第2节 hive基本操作:6、7、8
第1节 hive安装:6.hive的基本操作:7.创建数据库的语法:8.hive当中创建内部表的语法. hive的基本操作: 创建数据库与创建数据库表操作 创建数据库操作:create databas ...
- CentOS中一些基本的操作记录
1)切换到root su root 输入你的密码.我的是123