function call operator
在class中加入operator()使类具有函数的特征
#include<iostream>
class mul{
public:
mul(int x){
multiplier=x;
}
int operator()(int x) const {
return x*multiplier;
}
private:
int multiplier;
};
int main(){
mul test(10);
std::cout<<test(2)<<std::endl;
}
lamda expression
[传入的变量列表](函数参数){函数体}(调用);
在[ ]中声明需要使用的调用体的域中的本地变量,全局变量不需要声明。[=]表示所有的变量以赋值的形式传入,[&]表示所有的变量以引用的形式传入,[=,&j]表示除j外都以赋值传入,[i,&j],表示i以赋值传入,j以引用传入
第一个()为参数列表
{}中是函数体
第二个()表示调用
#include<iostream>
int main(){
int x=1;
double y=1.2;
bool z=false;
[x,&y](int i){std::cout<<i+x+y<<std::endl;}(1);
return 0;
}
accumulate
累加, demo 如下所示,可使用vector的迭代器
#include <iostream>
#include <vector>
#include <numeric>
int main(){
int can[]={1,2,3,4};
int r=std::accumulate(can,can+4,0);
std::cout<<r<<std::endl;
return 0;
}
distance
返回迭代器之间的距离,demo如下:
#include <iostream>
#include <vector>
int main(){
char a[]={1,2,3,4,5};
std::vector< int> b={1,2,3,4,5};
std::cout<<std::distance(a,a+4)<<std::endl;
std::cout<<std::distance(b.begin(), b.end())<<std::endl;
return 0;
}
advance
增加迭代器变量值,在list中应使用这个
#include <iostream>
#include <vector>
int main(){
std::vector<int> v={1,2,3,4,5};
auto b= v.begin();
std::advance(b,2);
std::cout<<v[b-v.begin()]<<std::endl;
return 0;
}
hash
对对象进行hash
#include <iostream>
#include <string>
int main(){
std::hash<std::string> test;
std::cout<<test("hello")<<std::endl;
return 0;
}
find
在容器中查找元素
move
将object转移给其他的变量,leaves the source object with a NULL pointer
#include<iostream>
int main(){
std::string a="abs";
std::cout<<a<<std::endl;
std::string b=std::move(a);
std::cout<<a<<std::endl<<b<<std::endl;
return 0;
}
函数传入参数,是否会拷贝副本的问题
当调用函数时,在函数的scope中,一般使用的是参数的副本,即在执行函数体之前参数的copy版本会被传入,然而当参数是一个新建的对象而没用变量指向它时,它会直接传入调用的函数中去,而不会传入它的副本,以下代码可以验证这个问题。
#include<iostream>
class c{
int a;
public:
c(int x):a(x){}
c(const c &x){
a=x.a;
std::cout<<"copy constructor called"<<std::endl;
}
};
void func(c x){
std::cout<<"func called"<<std::endl;
}
int main(){
c t(10);
std::cout<<"object with name:"<<std::endl;
func(t);
std::cout<<"object without name:"<<std::endl;
func(c(20));
return 0;
}
std::mem_fn
将类的成员保存在一个变量中之后调用,”Its functional call takes as first argument an object of type T (or a reference or a pointer to it) and, as additional arguments, the arguments taken by pm (if any). The effect of such a call with fn as first argument are the same as calling fn.*pm (or (*fn).*pm if fn is a pointer), forwarding any additional arguments.”
#include <iostream> // std::cout
#include <functional> // std::mem_fn
struct int_holder {
int value;
int triple() {return value*3;}
};
int main () {
int_holder five {5};
// call member directly:
std::cout << five.triple() << '\n';
// same as above using a mem_fn:
auto triple = std::mem_fn (&int_holder::triple);
std::cout << triple(five) << '\n';
return 0;
}