新概念:
迭代器、容器索引和迭代器失效
迭代器也是一種自定義類物件。但它本身在資料結構中具有一定的語義,它是用來訪問、遍歷某種資料結構的工具。對於我們的容器而言,它就是一種訪問容器的介面。根據對容器的訪問許可權(讀、寫)分為兩種迭代器:const迭代器和非const迭代器。前面已經講過const語義了,所以很容易想到const迭代器是用來對容器做唯讀操作的。
前面我們都使用索引去訪問我們的容器,現在認識了迭代器,我們就又多了一種訪問容器的方法了。容器在被操作的時候,其內部資料可能會發生變化,比如增加或減少。這樣的話,我們的容器的索引和迭代器都有可能失效。比如我們有乙個std::vector容器,它有1個元素,此時索引0和迭代器vec.begin()都是關聯著這個唯一的元素的。當我們將這個元素刪除的時候,那麼索引0和迭代器vec.begin()都將失效。一般來說、對容器的寫操作都可能會引發某些迭代器和索引失效,我們應該對容器的特性以及操作引發的***都要認真的去了解,那樣才能正確且安全的對我們的容器進行訪問。
新設施:
std::list
、isspace、
std::list
和std::vector一樣都是標準庫提供的容器。但是他們是兩種不同的資料結構。
std::vector
具有連續儲存的性質,而
std::list
則沒有。教材中使用std::list去優化我們的**,是利用了std::list對元素的高效刪除和插入操作。
isspace
是乙個c函式,c++將一些c庫函式放到頭中提供給我們使用。這個函式是判斷乙個字元是否是空白字元的函式,如果是則返回true,否則返回false。
新技術:
使用迭代器代替索引、容器erase返回的迭代器、根據資料結構特性選擇、根據語義去理解
標準庫中容器不是都支援索引的,但是卻都支援迭代器,所以我們使用迭代器代替索引會讓我們的**更具有擴充套件性,並且我們的標準庫容器演算法均提供對迭代器的支援,而非索引。
容器中erase操作是會引發一定的迭代器失效的(根據不同的資料結構而言影響的地方有所不同,但是都會影響到當前迭代器)。但是這個操作在標準庫中具有乙個統一的語義,它將返回被刪除位置(當前迭代器)的下乙個位置的迭代器。所以教材中使用了這個返回值來保證我們的迴圈能正確的遍歷容器。
教材中用std::list替換std::vector讓我們看到了程式在效率上得到的提公升,這說明了我們在選擇資料結構的時候要根據我們的程式對容器的操作以及容器具有的特性來做出取捨。雖然可能多種容器都能完成我們的工作,但不是每個容器都是最適合我們當前程式的。
教材中有++iter;這樣的**。這個迭代器在不同的容器中引發的操作可能會是不同的,但是它們的語義是相同的:將這個迭代器移動到當前關聯的元素的下乙個元素進行關聯。所以我們在使用它的時候不必去考慮到底它是記憶體中乙個元素大小的偏移,還是乙個指標的跳轉。只要理解其語義來使用,那就足夠了。這不僅僅表現在迭代器中,對於我們的任何抽象我們都應該用語義去理解它,讓我們離那些實現細節遠一些!
下一課:c++課堂第6章 使用庫演算法 希望我的課堂對大家學習c++有所幫助
第9章 順序容器 5
9.3.4 關係操作符 所有容器型別都支援關係操作符來實現兩個容器的比較。比較的容器必須具有相同的容器型別,而且其元素型別也必須相同。c 語言只允許兩個容器做其元素型別定義的關係運算。9.3.5 容器大小的操作 size操作返回容器內元素的個數 empty操作則返回乙個布林值,當容器大小為0時,返回...
第5章 陣列與字串
5.1 陣列array 5.1.1 陣列的概念 語法 型別陣列名 型別陣列名 元素個數 不能定義長度為 0的陣列,即 裡不能是 05.1.2 記憶體中的陣列 獲得陣列的尺寸 即元素的個數 int n sizeof a sizeof int 5.1.3 陣列的初始化 初始化時,右值由 括起一組初始值列...
順序容器 字串操作
include include include using namespace std void replace string string s,const string oldval,const string newval if iter2 oldval.end while iter2 newva...