多态性:fstream继承自iostream,ifstream继承自istream,ofstream继承自ostream,因此参数为iostream的引用/指针的可以直接传入fstream的实参。
操作步骤:创建文件流,打开文件,读写文件,关闭文件。
操作示例:
char data[100];
// 以写模式打开文件
ofstream outfile;
outfile.open("afile.dat",app);//追加写模式打开
cout << "Enter your name: ";
cin.getline(data, 100);
// 向文件写入用户输入的数据
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// 再次向文件写入用户输入的数据
outfile << data << endl;
// 关闭打开的文件
outfile.close();
// 以读模式打开文件
ifstream infile;
infile.open("afile.dat");
infile >> data;
// 在屏幕上写入数据
cout << data << endl;
// 再次从文件读取数据,并显示它
infile >> data;
cout << data << endl;
// 关闭打开的文件
infile.close();
在STL标准库的实现当中,vector内存不够时,会动态的把自己的容量扩展原来的1.5-2倍。这个过程他会重新申请内存,并把原来的数据拷贝到新内存当中来,并删除原来的内存。这样的拷贝效率确实有点低. 这个问题可以通过在vector当中只存储大对象的指针来优化, 但是还是存在一些不必要的拷贝。
可以使用reserve()成员设置每次重新分配的最小容量,size()获取vector当前实际大小,capacity()获取当前容量。
如:
int main()
{
vector vec_int(10,0);
cout<<"size:"<
(1)函数指针
回调函数最常见的应用就是STL里的泛型算法,如快排的使用就会用到回调机制。
template
void
sort(_RAIter, _RAIter, _Compare);
这个原型中第三个参数即回调函数入口,需要用户提供一个比较方法,比如对于一个vector
bool cmpByValue(const pair &x,const pair &y)
{
return x.second>y.second;
}
实现上述比较函数后,可以将函数名作为参数传入sort(),函数名传参时隐式转化为函数指针,这是函数指针实现回调的一种典型用法。
sort(vec_test.begin(),vec_test.end(),cmpByValue);
(2)仿函数
仿函数是一个类,一个重载了operator()的类,因此该类的对象可以像函数一样被调用,因此仿函数又被称为函数对象,是C++面向对象里最初的可调用对象。
函数指针实现的回调没有函数对象优雅,如下:
class myCmp{
public:
bool operator()(const pair &pr1,const pair &pr2){
return pr1.second>pr2.second;
}
};
(3)lambda表达式(C++ 11)
lambda表达式可以理解为一个匿名的内联函数,对于一些短小的函数体可以以表达式的形式更精简的实现,提高了代码的可读性。lambda表达式是可调用对象的一种。
值得一提的是,lambda本质是个函数,所以可以直接传入C函数的回调接口,但是仿函数本质是个对象,不能直接传入C接口的函数参数。
Lambda表达式的基本语法是:
[上下文变量说明](Lambda表达式参数表) -> 返回类型 { 语句块 }
上下文变量说明部分就是说明对于上下文变量的引用方式,=表示值传递,&表示引用传递,
例如,&s就表示s变量采用引用传递,不同的说明项之间用逗号分隔,可以为空,但是方括号不能够省略。
第一项可以是单独的一个=或者&,表示,所有上下文变量若无特殊说明一律采用值传递/引用传递,什么都不写默认为值传递。
同样的sort()函数,以lambda表达式示例如下:
int main()
{
vector > vec_test;
for(int i=0;i<10;i++){
vec_test.push_back(make_pair(i,i+1));
}
sort(vec_test.begin(),vec_test.end(),[=](const pair &pr1,const pair &pr2){
return pr1.second>pr2.second;});
for(auto e:vec_test){
cout<
(4)std::function类(C++ 11)
function<>可以将普通函数,lambda表达式和函数对象类统一起来。它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象)。
其中模板参数为函数的签名:返回类型+参数类型。
因此,function的作用可以理解成:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
std::function最大的作用就是用来实现函数回调,比如前面提到的仿函数不能直接作为C语言回调函数的接口,但是有了function<>的“统一”效果,仿函数可以通过fucntion处理后实现回调,如下:
int main()
{
vector > vec_test;
for(int i=0;i<10;i++){
vec_test.push_back(make_pair(i,i+1));
}
function &,const pair &)> myFunc;
myCmp cmp;//仿函数对象
myFunc=cmp;//转化为function对象实体
sort(vec_test.begin(),vec_test.end(),cmp);
for(auto e:vec_test){
cout<
class A{
...
private:
const int mVal=0;
...
};