C STL為什麼要有const iterator

2021-07-29 19:36:52 字數 1990 閱讀 4364

這是個困擾我很久了的問題,可能一開始對物件導向的理解不夠深。

剛剛想明白了,隨手記錄一下。

const iterator 是iterator本身是個常量,iterator本身裡面存的是指標,也就是iterator的值,也就是那個指標不能改變,也就是不能指向其他的位置,但是所指向的位置的元素是可以通過這個iterator來改變的。

const_iterator 其實本質來說,是另乙個類。我們可以想象成,它的資料成員是乙個指向常量元素的指標,(比如 const t*)也就是說,這個const_iterator裡存著的指標是可以改變的,即可以 ++ 或 - - 操作,但是,這是乙個指向常量的指標,指向的元素是常量,不可改變。

vector

ivec1(10);

const

vector

ivec2(10);

vector

::iterator iter1 = ivec1.begin(); // true

vector

::iterator iter2 = ivec2.begin(); // error

vector

::const_iterator iter3 = ivec2.begin(); // true

vector

::const_iteartor iter4 = ivec1.begin(); // true

通過上面這個例子,我們就可以更直觀的再深入理解一下了。

因為ivec2本身就是乙個常量的vector,所以ivec2裡面的元素必然是不能被改變的。如果直接定義乙個iterator是會報錯的,因為iterator意味著這個iterator可以遍歷容器,且可以改變容器元素,顯然如果容器被定義成常量了之後,這個iterator是不合理的。

所以這才有了const_iterator的出現。作為乙個迭代器,遍歷元素是必須要的,不然就喪失了乙個迭代器的意義了。但是由於常量容器的存在,iterator不能滿足這個需求。const_iteartor代表的就是不能改變容器元素,但是可以遍歷容器的迭代器。

但是const_iterator不僅僅是只針對已經被宣告為常量的容器用的,如果乙個非常量容器,但是你不想改變容器的元素,那麼也可以用const_iterator,因為裡面存的是乙個指向常量的指標。

/*vector的資料結構一般是這樣的*/

t* start;

t* finish;

size_t n;

typedef t value_type;

typedef t* iterator;

typedef

const t* const_iterator;

iterator begin() // ①

const_iterator begin() const // ②

const_iterator cbegin() const // ③

我們可以看到,vector裡面是這樣實現的。

begin()有兩個實現,外加乙個cbegin(),有三個實現。

①就是最一般的實現,可遍歷,可改變元素值。一般用於非常量容器。

②是可遍歷,不可改變元素值,一般用於常量容器。當你對乙個常量容器直接呼叫begin(),就是呼叫的②。呼叫值得一提的是,它這個不可改變元素值是全方位表現出來了的。從 typedef const t* const_iterator 開始,就限制了這是乙個指向常量的指標,不可改變元素值;②中返回值是const_iterator也說明了返回的是乙個存有指向常量的指標的迭代器;cosnt成員函式也說明了,不能通過這個函式來改變元素的值。

③其實跟②是幾乎一樣的,只是函式名不同,也就是說,當你例項化乙個常量vector時,你呼叫begin() 和 cbegin()其實是一樣的,沒有區別。但是,當你定義的是乙個非常量容器時,你想呼叫乙個不能改變所指向元素的迭代器,那麼就應該呼叫cbegin(),它可以滿足你的要求。

為什麼要有cgroup

linux系統中經常有個需求就是希望能限制某個或者某些程序的分配資源。也就是能完成一組容器的概念,在這個容器中,有分配好的特定比例的cpu時間,io時間,可用記憶體大小等。於是就出現了cgroup的概念,cgroup就是controller group,最初由google的工程師提出,後來被整合進l...

為什麼要有多型?

include include using namespace std 岳不群 class yuebuqun virtual void fight virtual表7示修飾的乙個成員方法時乙個虛函式,和虛繼承含義不同 string kongfu 林平之類 class linpingzhi publi...

為什麼要有 hashCode

當你把物件加入 hashset 時,hashset 會先計算物件的 hashcode 值來判斷物件加入的位 置,同時也會與其他已經加入的物件的 hashcode 值作比較,如果沒有相符的hashcode,hashset會假設物件沒有重複出現。但是如果發現有相同 hashcode 值的物件,這時會呼叫...