C++day16 学习笔记

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

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

View Code
   //快速排序算法,效率最高的排序算法。第一个参数表示数组首地址,第二个参数表示数组起始位置,第三个参数表示结束位置
   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>::iterator it;         //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>::iterator lt ;
                       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/

原文地址:https://www.cnblogs.com/tangzhengyue/p/2622640.html