• 读书笔记之:Essential C++ (2001)[+]


    第1章 C++编程基础

    1. 另一种初始化语法:构造函数语法(直接初始化)

    第2章 面向过程的编程风格

    1. 函数声明给出就是函数原型

    第3章 泛型编程风格

    1. 泛型算法

    2. 容器的insert操作:在position之前插入元素

    3. 容器的erase操作删除position所指向的元素

    4. 函数对象function objects

    函数对象的使用:

    View Code
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <algorithm>
    #include <functional>
    using namespace std;
    int main(){
        int n=10;
        vector<int> li;
        for(int i=0;i<n;i++){                     
            int val=rand()%1000;
            li.push_back(val);
        }
        cout<<"vector:";
        vector<int>::iterator ite;
        for(ite=li.begin();ite!=li.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;
        sort(li.begin(),li.end());
        cout<<"vector:";
        for(ite=li.begin();ite!=li.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;
        sort(li.begin(),li.end(),greater<int>());
        cout<<"vector:";
        for(ite=li.begin();ite!=li.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;
    }

     

    5. 函数对象适配器

    示例程序如下:

    View Code
    #include <iostream>
    #include <vector>
    #include <functional>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    vector<int> filter(const vector<int>& vec,
            int val,const less<int> &lt){ 
        vector<int> nvec; 
        vector<int>::const_iterator ite=vec.begin();
        while((ite=find_if(ite,vec.end(),bind2nd(lt,val)))!=vec.end()){
            nvec.push_back(*ite);
            ++ite;
        }   
        return nvec;
    }   
    int main(){
        int n=10;
        vector<int> li;
        for(int i=0;i<n;i++){
            int val=rand()%1000;
            li.push_back(val);
        }   
        cout<<"vector:";
        vector<int>::iterator ite;
        for(ite=li.begin();ite!=li.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;
        int val=rand()%1000;
    //    less<int> ls;
        vector<int> nvec=filter(li,val,less<int>());                     
        cout<<"less than "<<val<<" : ";
        for(ite=nvec.begin();ite!=nvec.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;
        
    }

    这儿需要注意一点,对于filter函数的声明vector<int> filter(const vector<int>& vec, int val,const less<int> &lt);的最后一个参数lt,如果不声明为const的话,需要传入左值。这样在调用的时候,必须声明一个less<int>的实例,然后传入该函数,即:

    less<int> ls;

    vector<int> nvec=filter(li,val,ls);

     

    如果声明为const后,就可以传入一个右值,正如上面的示例程序中所使用的。

    这儿其实就是const引用和非const引用的一个重要区别:可以将非const引用变量和常量来初始化const引用,而不能用常量初始化非const引用。

    测试程序:

    View Code
    #include <iostream>
    #include <vector>
    #include <functional>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    template <class InputIterator,class OutputIterator,
             class ElemType,class Comp>
    OutputIterator filter(InputIterator first,InputIterator last,
            OutputIterator at,const ElemType &val,const Comp& pred){
        while((first=find_if(first,last,bind2nd(pred,val)))!=last){
            cout<<"found value: "<<*first<<endl;
            *at++=*first++;
        }
        return at;
    }
    int main(){
        int n=10;
        vector<int> li;
        srand(time(0));
        for(int i=0;i<n;i++){
            int val=rand()%1000;
            li.push_back(val);
        }
        cout<<"vector:";
        vector<int>::iterator ite;
        for(ite=li.begin();ite!=li.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;                                                    
        int val=rand()%1000;
        vector<int> nvec(li.size());
        filter(li.begin(),li.end(),nvec.begin(),val,less<int>());
        cout<<"less than "<<val<<" : ";
        for(ite=nvec.begin();ite!=nvec.end();++ite)
            cout<<*ite<<' ';
        cout<<endl;

    }

    5. map使用

     

    6. 使用set

    7. 使用Iterator Inserters:插入适配器

    8. 使用iostream iterators

    #include <iostream>
     #include <iterator>
     #include <algorithm>
     #include <vector>
     #include <string>
     using namespace std;
     int main(){
         istream_iterator<stringis(cin);
         istream_iterator<string> eof;
         vector<string> text;
         copy(is,eof,back_inserter(text));
         sort(text.begin(),text.end());
         ostream_iterator<string> os(cout," ");
         copy(text.begin(),text.end(),os);
         cout<<endl;                              
     
     }

     

    第4章 基于对象的编程风格

    1. const与mutable

     

    第5章 面向对象的编程风格

    1. 派生类覆盖基类的虚函数的时候,返回类型可以不严格的一样。

    2. 虚函数的静态决议

     

    3. RTTI:typeid和dynamic_cast

    第6章 以template进行编程

    第7章 异常处理

    1. C++中的RAII:构造函数分配资源,析构函数释放资源

  • 相关阅读:
    net.sf.json.JSONException: There is a cycle in the hierarchy!
    数据源的配置
    java枚举使用详解
    hibernate级联保存,更新个人遇到的问题
    NonUniqueObjectException 问题
    No.2 dotnetcore&docker--数据库等在Docker上的配置
    No.1 dotnetcore&docker--环境搭建
    No.5 dotnetcore&docker--采用Ambry做文件服务器
    No.3 dotnetcore&docker--搭建一个nuget服务器
    关于APM数据采集实例以及Eureka整合的一个想法
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2642195.html
Copyright © 2020-2023  润新知