C++day16 學習筆記

來源:互聯網
上載者:User

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/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.