簡介
所有標準庫類型都可以使用迭代器,但是其中只有少數幾種才同時支持下標運算符,有迭代器的類型都擁有begin()
和end()
的成員函數:
/*
* b和e類型相同
* 1) b: 表示v的第一個元素
* 2) e: 尾後迭代器, 表示尾元素的下一個位置
*/
auto b = v.begin(), e = v.end();
Tips:如果容器爲空,那麼
begin()
和end()
返回的都是尾後迭代器。
迭代器類型
就像不知道string或vector的size_type
成員到底是什麼類型一樣,一般情況下我們也不知道(其實是無須知道)迭代器的精確類型。擁有迭代器的標準庫類型使用iterator
和const_iterator
來表示迭代器類型:
// 可讀寫元素的迭代器
vector<int>::iterator it1;
string::iterator it2;
// 只能讀而不能寫的迭代器
vector<int>::const_iterator it3;
string::const_iterator it4;
迭代器運算符
1. 普通運算符
Tips:因爲
end()
返回的迭代器類並不實際指向某個元素,所以不能對其進行遞增或者解引用的操作。
*iter // 返回迭代器所指元素的引用
iter->mem // 解引用迭代器並獲取該元素名爲mem的成員, 等價於(*iter).mem
++iter // 令迭代器指向下一個元素
--iter // 令迭代器指向上一個元素
iter1 == iter2 // 如果兩個迭代器指向同一個元素或者是同一個容器的尾後迭代器, 那麼相等
iter1 != iter2
2. begin和end運算符
前面我們提到迭代器有begin
和end
運算符,它們返回的具體類型取決於對象是否是常量。如果對象是常量,那麼begin
和end
返回const_iterator
,否則返回iterator
。
有時候這種默認的行爲並非我們想要,如果對象只需讀操作而無需寫操作時最好使用常量類型,C++11新標準引入了兩個新函數用於返回const_iterator
:
vector<int> vi;
auto it = vi.cbegin(); // it的類型是vector<int>::const_iterator
迭代器運算
// 迭代器加上(減去)一個整數仍得到一個迭代器, 指向的新位置與原來相比向前(向後)移動了n個位置, 結果迭代器指向容器內的一個元素或者尾後元素
iter + n
iter - n
iter += n
iter -= n
// 等於兩個迭代器的距離, iter2向前移動n個元素後得到iter1
// 返回值是類型爲difference_type的帶符號整型數
iter1 - iter2
// 迭代器的關係運算符
>、>=、<、<=
注意事項
- 某些對vector對象的操作可能會使迭代器失效
注意push_back()
操作會使得vector對象的迭代器失效,因此不要在範圍for循環中向vector對象添加元素,因爲範圍for循環中預存了end()
的值。