2012-04-28 53 views
0

C++中的每個變量都有一些類型,如int i,i有一個類型int。 同樣,我們在STL迭代器,我們宣佈說這句話STL中迭代器的類型是什麼?

 map<string,int>::iterator it . 

什麼是it在這裏的類型?它是指針類型,還是指針類型爲 我們通常會讓迭代器在存儲int或其他類型的向量的情況下獲取這些itearors關聯或指向的值。或者運算符*被重載用於STL中的迭代器?

回答

4

24.2.1/1 [iterator.requirements.general]概括起來很好:

迭代器是指針,允許C++程序以均勻的具有不同數據結構(容器)的工作的概括方式。爲了能夠構建在不同類型的數據結構上正確高效工作的模板算法,該庫不僅形式化了接口,而且還形式化了迭代器的語義和複雜度假設。

短語「指針的泛化」意味着指針迭代器。允許std::vector<T>::iterator是一個typedef T *。但是,大多數迭代器通過操作符重載來實現接口。 (請注意,迭代器不需要屬於容器,也可以)。

這種語言是C++標準編寫方式的典型代表。它描述了事情的行爲,但是避免了用基類來定義接口。有各種迭代器:輸入,輸出,轉發,雙向和隨機訪問。每種規範都有不同的規定,雖然隨機訪問是雙向接口的嚴格超集,但它們在C++類型系統中完全無關。

迭代器可以是++*重載的任何類,並且有效的專用std::iterator_traits。有基類std::iterator它與std::iterator_traits一起使用來定義必要的接口。這是C++泛型編程和特徵類的一個很好的案例研究。

+0

std :: map :: iterator那麼tpedef會是什麼呢? 'T *'或'T1 *'? – Invictus 2012-04-28 13:56:16

+1

@Ritesh'std :: map :: iterator'與指針有着根本的區別,所以它也不能。 – Potatoswatter 2012-04-28 14:01:29

+0

+1用於定義行爲。 – 2012-04-28 14:32:09

6

什麼是it的類型?

it的類型是map<string,int>::iterator,這是一類有一堆運算符重載的類。

對於某些容器類型,Container::iterator可能是原始指針類型。對於map,它必須是一個類。

+0

迭代器是否重載了'*'運算符? – Invictus 2012-04-28 13:48:17

+0

@Ritesh:是的。 – NPE 2012-04-28 13:49:09

+0

是的,除非它們只是用指針來實現(因爲它可能會與'std :: vector :: iterator'發生)。 – 2012-04-28 13:49:10