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

时间:2022-02-02 04:21:16

第1章 C++编程基础

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

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

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

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

第3章 泛型编程风格

1. 泛型算法

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

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

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

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

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

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

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

4. 函数对象function objects

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

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

函数对象的使用:

读书笔记之:Essential C++ (2001)[+]读书笔记之:Essential C++ (2001)[+]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. 函数对象适配器

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

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

示例程序如下:

读书笔记之:Essential C++ (2001)[+]读书笔记之:Essential C++ (2001)[+]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引用。

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

测试程序:

读书笔记之:Essential C++ (2001)[+]读书笔记之:Essential C++ (2001)[+]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;

}

 

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

5. map使用

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

 

6. 使用set

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

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

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

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

8. 使用iostream iterators

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

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

#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;                              
 
 }

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

 

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

1. const与mutable

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

 

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

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

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

2. 虚函数的静态决议

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

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

 

3. RTTI:typeid和dynamic_cast

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

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

第6章 以template进行编程

第7章 异常处理

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

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