《C++Primer》學習筆記(11-12章)



第十一章 算法

1.   size_t  <cstddef>算法

back_inserter <iterator>安全

2.   提到的算法函數

find(vec.begin(), vec.end(), ival);this

find_first_of(vec1.begin(), vec1.end(),vec2.begin(),vec2.end());spa

accumulate(vec.begin(), vec.end(), ival); // 第三個實參提供累加初始值和關聯的類型指針

 

//寫入運算不檢查目標的大小是否知足寫入的數目對象

fill(vec.begin(), vec.end(), 0); //  是寫入安全的接口

fill_n(vec.begin(), 2, 0); // 前兩個元素賦爲0 ,必須保證vec至少有2個元素,不然運行錯ci

fill_n(back_inserter(vec),2, 0); // 至關於在vec後面push_back兩個0作用域

    back_inserter是迭代器適配器

copy(ilst.begin(), ilst.end(),back_inserter(ivec));

replace(ilst.begin(), ilst.end(), 0, 42); // 等於0的元素換成42

replace_copy(ilst.begin(), ilst.end(),back_inserter(vec), 0, 42); // ilst不變,複製到vec中,其中0換成42

 

sort(vec.begin(), vec.end());

vector<string>::iterator end_unique = unique(words.begin(),word.end()); // 把重複單詞移動到後面去,返回無復下一位置

       算法不改變容器大小,要刪掉重複元素必須使用容器操做 words.erase(end_unique,words.end());

 

count_if(words.begin(), words.end(), GT6); //函數要求謂詞函數只能一個參數,即迭代器範圍內的元素

stable_sort(words.begin(), words.end(),isShorter);

以上四五行參考代碼test統計六個及以上字母組成的單詞.cpp

3.   front_inserter使用push_front,這個算法不能用在Vector上,它沒有這個操做

inserter(ilst, it); //指定插入位置, 在it以前插

    注意:copy(ilst.begin(), ilst.end(), inserter(ilst2,ilst2.begin()));//正序插入

                                          //每次都在固定位置插入

       copy(ilst.begin(),ilst.end(), front_inserter(ilst1));//逆序插入

4.   d

    list<int> ilst;

    for (inti=0; i<5; ++i) {

       ilst.push_back(i);

       ilst.push_back(i);

    }

    ilst.sort();

    printList(ilst);

    ilst.unique(); // 刪掉,而不是後移重複元素,這不是算法函數,因此真正修改了基礎容器

                  // 真正修改基礎容器的還有remove,算法函數中remove是把等於指定值的元素們

                  // 前移,返回第一個不等於val的元素的位置

printList(ilst); 

5.    

6.   ‘

1.   非static成員函數有this.  Const必須同時出如今定義和聲明中,否則出錯

2.   只有類中有不多的方法且有公有數據時,使用Struct,或只有公有數據時。

3.   封裝好處:一,防止用戶級破壞,二,只要接口不變,不須改動用戶級代碼。 Cpp文件纔是類定義文件

4.   前向聲明是不徹底類型,只能用於定義指針或引用(只是定義,不能使用它們來訪問成員),或聲明使用該類型做爲形參或返回值的函數。 能夠定義該類型的static對象

5.   this的類型是一個指向類類型的const指針。

const成員函數只能返回*this做爲一個const引用:對於返回*this或this的函數,const如有則必同時有

const Dog* run1() const { return this; } // const成員函數中,this是指向const對象的const指針,函數返回類型必須是const的

const Dog& run2() const { return *this; } // const成員函數中,*this是const對象,返回值只能是一個const的引用

6.   基於成員函數是否const能夠重載,基於形參是否指向const對象能夠重載。Const對象使用const成員。

7.   可變數據成員mutable,這樣const成員函數能夠改變它或它是const對象的成員時也可改

8.   形參表和函數體處於類做用域中

Char Screen::get(indexr, index c) const { // index前不用加Screen

    Indexrow = r*width;

    return...

}

9.   Student *sp = new Student();

Student s = Student;

 

構造函數不能是const的。  建立const對象時,運行一個普通構造函數來初始化const對象

    構造函數的初始化在冒號以後,在執行構造函數以前。初始化列表中沒有寫出來的成員的初始化狀況:對於類類型則調用默認構造函數,對於內置或複合類型的初始化:(若是對象定義在局部做用域中,則不進行初始化,若是定義在全局做用域中,初始化爲0),因此,含有內置類型或複合類型的類應該定義本身的構造函數來初始化這些成員,不該該依賴合成的構函。初始化順序是成員的定義順序,而非初始化列表寫的順序

 

    必須在初始化列表中初始化:無默認構函的對象成員,const或引用成員

 

    若是沒有本身定義了構函,且都是單參並有各自的默認實參:error

   

    explicit:避免了單參構函的形參類型到該類類型的隱式轉換  它只能使用在類定義體內的構函前面的聲明上,類定義體外此構函定義時前面不能加explicit

Studentstu = stu1; 執行復制構函

StudentStu(「leiming」, 24); // 直接初始化

Studentstu(stu1); // 複製構函

10.  對於沒有定義構函的且成員全是public的類可使用Data val2 = {23, 「abc」}的方式初始化

struct Data {int ival; char *p;};

11.  友元能夠是非成員函數,能夠是已知類的成員函數,也能夠是類

12.  若要將成員函數定義爲inline,則聲明的時候能夠沒必要寫inline,它是用於定義的關鍵字。定義爲inline

相關文章
相關標籤/搜索