1、c++ stl中提供了順序容器和關聯容器。vector,list,deque為順序容器;map,set,multiset,multimap為關聯容器。其中每種容器均提供預設的建構函式來初始化容器物件。
vectorstr(5);
在這句**中,首先容器使用string的預設建構函式建立了乙個臨時值來建立容器物件,並且呼叫拷貝建構函式,將這個臨時值分別賦值給其他物件。
2、容器初始化時要注意,有些方式只適用於順序容器:
c c(n,t);
c c(n);
在上述**中,n代表整數時,表示建立n個物件,這種情況下接受容器大小做形參的建構函式只適用於順序容器,而不適用於關聯容器。
3、在將乙個容器複製給另乙個容器時,一定要注意,容器的型別及元素型別均要相同才可;否則不能複製;
vectora;
listb(a);
上述**因為容器型別不同,所以是錯誤的。
4、為了解決不同容器之間可以相互複製的問題,我們可以傳遞一對迭代器,將兩個迭代器之間的元素進行複製。這樣也就意味著,我們不僅可以複製無法直接複製的容器的值,還可以複製其他容器的子串行。
5、任意容器當中的元素應該滿足以下兩個條件:
(1)、元素的型別必須支援賦值運算;
(2)、元素的型別必須支援複製運算;
其實說的更直白一點,要有拷貝建構函式,要過載賦值運算子;因此,引用,io,還有auto_ptr是不能做容器元素的。
6、考慮以下幾行**:
vectora;
vectorb(10);
vectorc(10,5);
在第一行中,實際上不會呼叫foo類的預設建構函式;第二行**中會先呼叫預設建構函式,再呼叫拷貝建構函式;第三行**中會先呼叫含有乙個int型引數的建構函式,再呼叫拷貝建構函式。
7、容器的容器中,需要注意一點;就是格式:
vector< vector>a;
vector< vector>b;
第一行是對的,第二行是錯的,看出來了吧,就是要空格。
8、說起迭代器,最容易讓人想到的就是運算。但是只有vector和deque支援元素的快速隨機訪問,因此只有vector和deque支援關係運算子,<,>,=。
9、在迭代器所指向的範圍中,前閉後開,[first,last);除此之外,迭代器只能指向容器的第乙個位置到最後乙個位置的下乙個位置;並且容器的last迭代器是不允許超過first迭代器的。
10、由於編譯器無法知道,迭代器關聯的是哪個容器,因此,在做一些改變容器的元素的操作或是迭代器的操作時,可能導致迭代器失效。
11、在容器中新增元素時,增加的都是元素的副本。
12、在使用insert時,一定要注意,是在其指向位置的前面插入元素,而非之後。
13、任何insert和push操作都會是vector和deque容器的迭代器失效,所以在迴圈中要確保每一次迴圈迭代器是有效的。
vector::iterator first = v.begin(),last = v.end();
while(first!=last)
在上述**中,last經過第一次插入後就已經失效了,不再指向v,也不指向新的容器。所以一定要注意迭代器失效的情況,否則程式當中很難查詢錯誤。
14、容器均可只能關係運算子的比較。
15、容器通過resize()來改變容器的長度大小;如果當前長度大於新的長度值,這該容器後部的元素會被刪除;如果當前長度小於新的長度值,則使用預設值來初始化多餘的元素。
resize操作可能因此vector和deque的迭代器失效。如果resize進行壓縮操作,則指向已刪除的元素的迭代器失效。
16、c.at(n)這種操作只適用於vector和deque容器。
17、容器的賦值操作是需要非常注意的。c1=c2;當這種賦值情況發生時,首先將c1中的所有元素全部刪除,再將c2中的元素複製到c1中;此時的c1與c2必須容器型別和元素型別均相同;c.assgin(b,e);此時b,e為迭代器,並且必須不是指向c中元素的迭代器。這時首先刪除c中元素,然後將迭代器b,e所指範圍內的元素複製到c中。
18、相比賦值和assign函式,swap函式執行效率要高很多。swap交換兩個容器的值,既不會刪除或插入元素,而且保證在常量時間內交換。由於容器內沒有移動元素,因此迭代器依然有效。即:之前指向哪個元素的迭代器,依然指向哪個迭代器。
19、capacity()是指容器在必須分配新儲存空間之前,可以儲存的元素的總數;而size是指容器中當前擁有的元素個數。reserve是分配記憶體空間。
opengl 入門學習 隨筆五
今天開始opengl的學習,下面上第乙個程式!void mydisplay int main int argc,char argv 整個程式表示顯示乙個矩形 這裡有幾個概念稍微介紹一下 1 glclear 表示清除背景,也就是說我們在黑板上清除的效果是顯示全黑,在白紙上清楚顯示的是全白 2 glut...
C 學習隨筆
過載 通過函式過載實現類的多型特性,其特徵 1 同一作用域內 同一類中 2 相同的函式名。3 引數與返回型別不同 僅返回型別不同,不是過載函式。4 virtual關鍵字不影響。覆蓋 通過函式覆蓋實現類的繼承特性,其特徵 1 不同作用域 非同一類中 2 函式名 引數都相同。3 基類中的函式須有virt...
C 學習隨筆
1.引用必須在宣告時初始化,並且初始化後不能改變其值,類似於是乙個指標常量,而指標可以先宣告再初始化,並且指標指向的值可以隨時改變。2.如果帶引數列表的函式,必須從右向左新增預設值,也就是說如果函式引數列表中某乙個引數設定為預設值,那麼其右的所有引數必須提供預設值 int test int a,in...