C++ 学习笔记 day16

来源:互联网 发布:新浪娱乐 网络兼职 编辑:程序博客网 时间:2024/06/06 17:22

1、算法
    脱离具体的语言
    有穷性 --- 在保证执行有限步骤之后确定能够结束
    确切性 --- 每条语句具体干什么
    输入输出 --- 所有的算法都有输出,打印屏幕,写文件,写DB

2、快速排序法
   数据个数超过一个,任选其中一个数据作为分界值,把其他数据按大小关系分为2组,分界值在中间
   对两组数据实行递归重组

   //快速排序算法,效率最高的排序算法。第一个参数表示数组首地址,第二个参数表示数组起始位置,第三个参数表示结束位置

  void mysort( int * p , int left , int right ){

           int l = left ;     //从左侧开始走

           int r = right ;    //从右侧开始走

           int povit = p[(left + right)/2]; //把数组中间的一个数据作为分界点

           do{

                     while( p[l]<povit&& l < right ){   //循环退出,则是l找到一个比自己大的

                           l++ ;

                     }

                     while( p[r]>povit&& r > left ){

                            r--;

                    }

       

                    if( l <= r ){

                            int t = p[l];

                            p[l] = p[r];

                            p[r] = t ;           

                            l++;

                            r--;

                    }

            }while( l <= r );   //条件就是左右的两个人还没有碰面

            

            if( r > left ){      //只要右边的仍比左边的大,就要继续循环

                   mysort( p , left , r );          

            }

 

            if( l < right ){      //只要左边的仍比右边的大,也要继续循环

                    mysort( p , l , right );

              }

    }

3、直接使用系统的qsort()函数
   要自己定义一个排序规则  
  
4、模版
  (1)模版的参数至少出现一次,才能确定类型
  (2)只能在紧跟的函数中使用,函数声明紧跟在后面
       声明多个模版类型 template<class T1 , class T2>    
       class关键字不能省略
  (3)对于模版类型的要求,要能重载">","<","="
       建议:在编码时能用一种运算符完成的操作,就不要使用多个运算符,避免多个重载
  (4)用模版写的函数叫函数模版
          函数模版在调用的时候确定类型的
       用模版写的类叫类模版
          数据类型,参数类型,函数返回类型都可以使用模版
         
       类模版不是类,是不完整的类
       类模版要在声明时用类名<int>指定,确定类型
      
  (5)C++的泛型(模版)是编译时确定类型的 --- 效率             
       Java的泛型是运行时的
      
  (6)模版类的声明和定义(多文件结构)是不能分开的
       模版函数的声明和定义是可以分开的  template<class T> 在头文件和实现文件中都要出现

5、STL包含三大类,容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类)
     容器可以直接存储对象,也可以存储对象的指针。成熟的程序员喜欢使用间接存储。
     容器主要包括两种类型:序列类(一般是线形存储)和关联类(一般是非线性存储)。

     vector ----   数组  可变长   不提供pop_front()删除头元素的函数
      list      -----  链表
     
      (1)Vector    v[1000]当越界的时候,会出现段错误

               v.at(1000) 越界的时候,会抛出out_of_range的异常,在程序中捕获

               v.size()  返回长度,可利用这个循环迭代

               v.empty()判断容器是否为空

              

               Iterator迭代器  : 可以做取*操作   *iterator

                                             iter->name  <=>(*iter).name

                                             iter++

                                             

               v.begin()  指向数组的开始

               v.end()      指向数组最后一个元素的后面,是一个结束标志

              

               vector<int> v1;

              vector<int>::iteratorit;         //iterator是vector的一个内部类

              for( it = v1.begin(); it !=v1.end(); it++ )

                            cout << *it<< endl;

 

               v.insert(iter,5);            //在iter所指的元素前面插入5

               v.insert(iter,5,100);    //在iter所指的元素前插入5个100

               这样的插入操作,会造成原来的iterator失效,对起重新赋值,可以保证继续使用

      (2)list
              不能做at()
              多了push_front(),pop_front()
              iter不能做加n操作
              使用于做频繁的插入删除操作
              
6、关联式容器
    (1)map
            适合根据键查找值的操作   
            存储上按照键值排序 ,并且key值唯一

                map<int,Student> m;

 

              Student s( 1 ,"liucy");

              m.insert(map<int,Student>::value_type(

                              s.getId() , s)  ) ;              //创建一个pair,并存到map的第一个位置中    value_type是map的静态函数

 

              Student s2( 4,"tangliang" );

            m.insert( map<int,Student>::value_type(

                             s2.getId() , s )) ;

 

           map<int,Student>::iterator it ;

           for(it=m.begin();it!=m.end();it++ ){

                     cout<< it->first<< " "<<it->second;

                     cout<<endl ;

           }

             在map中用[]查询,并不安全
             m.find(1);   // 查询key为1的value
              返回一个iter,指向找到的那个键值对,如果没找到,iter会与iter.end()的值相等

     (2)multimap
            其中的key允许重复

           查找:multimap<int ,Student>::iterator it ;

                       multimap<int ,Student>::iteratorlt ;

                       multimap<int,Student>::iterator ut ;

 

                      lt = m.lower_bound( 1 );

                     ut = m.upper_bound( 1 );

 

                     for( it=lt ; it != ut ;it++ ){

                                  cout<<it->first <<" " ;

                                 cout<<it->second <<endl;   

                    }

     (3)set
              set中不能插入重复数据,相当于map中的key
              插入数据的时候不必指定位置
              因为与map中的key一致,仍保留着排序的特性

     (4) multiset
              与vector类似,唯一不同的就是保留着排序的特性

7、模版的声明和实现都写在头文件中
     /usr/local/include/c++/3.2/

 

 

0 0