C++標準庫類型迭代器

簡介

所有標準庫類型都可以使用迭代器,但是其中只有少數幾種才同時支持下標運算符,有迭代器的類型都擁有begin()end()的成員函數:

/*
 * b和e類型相同
 * 1) b: 表示v的第一個元素
 * 2) e: 尾後迭代器, 表示尾元素的下一個位置
 */
auto b = v.begin(), e = v.end();

Tips:如果容器爲空,那麼begin()end()返回的都是尾後迭代器。

迭代器類型

就像不知道string或vector的size_type成員到底是什麼類型一樣,一般情況下我們也不知道(其實是無須知道)迭代器的精確類型。擁有迭代器的標準庫類型使用iteratorconst_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運算符

前面我們提到迭代器有beginend運算符,它們返回的具體類型取決於對象是否是常量。如果對象是常量,那麼beginend返回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()的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章