C 陣列 指標與vector iterator

2021-07-14 09:48:30 字數 2708 閱讀 9546

今天有點閒,於是開啟電子版的<>來看。其中9.2節有乙個表9.4,它指出了vector 和 deque型別迭代器支援的操作。這本來是很平常的,但是表中的iter1+iter2引起了我極大的興趣。於是寫了下面一段**來驗證是否真的能支援這運算

#include #include using namespace std;

int main()

使用mingw和g++進行編譯,結果報錯,錯誤資訊如下:

candidates are: __gnu_cxx::__normal_iterator<_iterator, _container>& __gnu_cxx::__normal_iterator<_iterator, _container>::operator+=(const typename std::iterator_traits<_iterator>::difference_type&) [with _iterator = int*, _container = std::vector>]

這也就是說在標頭檔案中根本就沒有為iterator進行+= iter,iter1+iter2運算子的過載。進過測試之後發現-=符號也報同樣的錯。至於iter + n ,iter – n,iter1 - iter2,這三種運算是沒有任何編譯問題的。也許是因為編譯器的問題吧,但是實驗到了這裡,我不由得開始思考到底iterator和指標到底有怎麼樣的聯絡和區別,

經過思考,我得出了下面幾個相同的地方:

1.       指標和iterator都支援與整數進行+,-運算,而且其含義都是從當前位置向前或者向後移動n個位置

2.       指標和iterator都支援減法運算,指標-指標得到的是兩個指標之間的距離,迭代器-迭代器得到的是兩個迭代器之間的距離

3.       通過指標或者iterator都能夠修改其指向的元素

通過上面這幾點看,兩者真的很像,但是兩者也有著下面的幾個不同地方

1.       cout操作符可以直接輸出指標的值,但是對迭代器進行在操作的時候會報錯。通過看報錯資訊和標頭檔案知道,迭代器返回的是物件引用而不是物件的值,所以cout只能輸出迭代器使用*取值後的值而不能直接輸出其自身。

2.       指標能指向函式而迭代器不行,迭代器只能指向容器

這就說明了迭代器和指標其實是完全不一樣的概念來的。指標是一種特殊的變數,它專門用來存放另一變數的位址,而迭代器只是參考了指標的特性進行設計的一種stl介面。

筆者曾在網上看到這樣一種說法:迭代器是廣義指標,而指標滿足所有迭代器要求。迭代器是stl演算法的介面,而指標是迭代器,因此stl演算法可以使用指標來對基於指標的非stl容器進行操作。

筆者覺得上面說法也有幾分道理,但是到底正不正確就留給看官自己判斷了。但是有一點希望大家注意的是:千萬不要把指標和迭代器搞混了。也許某些編譯器使用指標來實現迭代器以至於有些人會誤以為指標和迭代器是乙個概念來的。

ps:《c++ primer 4th》表9.4有誤,希望各位看官在看那本書的時候注意一下。

c++定義了內容豐富的抽象資料型別標準庫。其中最重要的之一就是vector。它定義了長度可變的同型別物件的集合。它往往將迭代器用作配套型別,用於訪問其中的元素。迭代器是一種檢查容器內元素並遍歷元素的資料型別。這二者是語言組成部分中更基本的資料型別陣列和指標的抽象。

現將兩對的主要區別簡要陳述:

一、陣列與vector:

#include 

using std::vector;

而陣列型別則不用;

2、vector不是一種資料型別,而是乙個類模板,它可以用來定義任意多種資料型別。vector標準庫型別提供了vector操作,可以直接呼叫用來檢驗象對是否為空串、元素的個數、vector物件的複製、動態增加元素、比較等操作,而陣列則沒有直接提供這些操作的函式可呼叫,尤其是要實現陣列的複製及求長度的操作相對很不方便;

3、vector是長度可變的,而陣列一旦定義長度就不再改變;

4、vector的索引型別為vector::size_type,陣列下標型別為size_t。

二、指標與iterator

1、迭代器是指標的抽象,標準庫為每一種標準容器(包括vector)定義了一種迭代器,如:

vector::iterator iter; 

這條語句定義了乙個名為iter的變數,它的資料是由vector定義的iteretor型別,而指標則是直接初始化為指向某一陣列或單個物件的指標,還可以指向函式,而迭代器不行;

2、每種容器都定義了一對命名為begin和end的函式,用於返回迭代器,其中end操作返回的是迭代器指向vector的"末端元素的下乙個",它起到的只是個哨兵的作用,表示我們已經處理完vector中的所有元素,而指標則沒有;

3、任何改變vector長度的操作都會使已存在的迭代器失效,即釋放已有記憶體,重新申請記憶體;

4、cout操作符可以直接輸出指標的值,但迭代器進行此操作的時候會報錯,因為迭代器返回的是物件引用而不是物件的值,因此只能輸出迭代器使用"*"取值後的值而不能直接輸出其自身;

相同:1、迭代器可以做兩個迭代器的相減,前提是二者指向同一vector中的元素,或指向vector末端之後的下乙個元素,指標也可以,前提是指向同一陣列,得到的都是二者之間的距離;同樣都不能實現相加操作;

2、都是用"*"操作符來實現解引用;

3、二者都支援與整數進行加減操作,其含義都是個自當前位置向前或向後移動相應的位置;

4、二者都能修改其指向的元素。

二者在const修飾下的不同,在const的應用中在論述。

請各位讀者指正賜教.....

C 指標陣列與陣列指標

說實話,c語言真的很讓人蛋疼,它不像物件導向的語言,我們重心在設計程式上。而使用c語言,你不僅要考慮程式的設計,你還要考慮很多他的使用細節,不然一不小心你怎麼死的都不知道。但是,個人感覺,c語言的魅力是其他任何語言都比不了的!繼續看。陣列指標 範例 typedef int aint5 5 typed...

C 指標陣列與陣列指標

陣列指標 也稱行指標 陣列指標 a pointer to an array,即指向陣列的指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣...

指標陣列與陣列指標 C

關於陣列指標 1 對於二維陣列,初始化時,必須指定乙個引數 int a 3 int a 這樣是不允許的,因為要確定指標移動一步要走多遠。對於一位陣列int a 這樣可以。也就數說只有乙個引數位置可以不用設定引數。2 int p 3 必須加上小括號,這代表乙個指向陣列的指標,數字3,代表每一列有三個數...