迭代器支援一套操作,這套操作使得我們能訪問容器的元素或者從某個元素移動到另外乙個元素。
迭代器提供了對物件的間接訪問。迭代器有有效和無效之分,有效的迭代或者指向某個元素,或者指向容器中尾元素的下一位置,其他情況都屬於無效。
獲取迭代器不是使用取位址符,有迭代器的型別同時擁有返回迭代器的成員。begin
成員負責返回指向第乙個元素的迭代器,end
成員負責返回指向容器尾元素的下乙個位置的迭代器。
// 由編譯器決定 b 和 e 的型別
// b 表示 v 的第乙個元素,e 表示 v 尾元素的下一位置
auto b = v.
begin()
, e = v.
end();
// b 和 e 的型別相同
迭代器運算子![](https://pic.w3help.cc/3b0/7be9cde7f87617598e88b161c7812.jpeg)
執行解引用的迭代器必須合法並確實指著某個元素,不能是非法迭代器或者尾後迭代器。
將迭代器從乙個元素移動到另乙個元素
使用遞增++
運算子來從乙個元素移動到下乙個元素,迭代器的遞增則是將迭代器」向前移動乙個位置「。
for
(auto iter = s.
begin()
; iter != s.
end()&&
!isspace
(*iter)
;++iter)
*iter =
toupper
(*iter)
;
迭代器型別擁有迭代器的標準庫型別使用iterator
和const_iterator
來表示迭代器的型別。
const_iterator
能讀取但不能修改它所指的元素值。iterator
的物件可讀可寫。
begin 和 end 運算子
vector<
int> v;
auto it1 = v.
begin()
;// 返回型別是 iterator
auto it2 = v.
end();
// 返回型別是 iterator
auto it3 = v.
cbegin()
;// 返回型別是 const_iterator
auto it4 = v.
cend()
;// 返回型別是 const_iterator
結合解引用和成員訪問操作箭頭運算子->
結合了解引用和成員訪問兩個操作,it->mem
和(*it).mem
等價。
某些對 vector 物件的操作會使迭代器失效
使用了迭代器的迴圈體,都不要向迭代器所屬的容器新增元素。
迭代器的算術運算
令迭代器和乙個整數值相加或相減,其返回值是向前或向後移動了若干個位置的迭代器。執行這樣的操作時,結果迭代器或者指向原物件內的乙個元素,或者指向元物件尾元素的下一位置。
使用迭代器運算
使用迭代器進行二分搜尋
auto beg = text.
cbegin()
, end = text.
cend()
;auto mid - text.
cbegin()
+(end - beg)/2
;while
(mid != end &&
*mid != sought)
if(sought <
*mid)
end = mid;
else
beg = mid +1;
mid = beg +
(end - beg)/2
;
第三章 字串 向量和陣列
標頭檔案不應包含using宣告。c 標準一方面對庫型別所提供的操作做了詳細規定,另一方面也對庫的實現者做出了一些效能上的需求。因此,標準庫型別對於一般應用場合來說有足夠的效率。如果使用等號 初始化乙個變數,實際上執行的是拷貝初始化 copy initialization 編譯器把等號右側的初始值拷貝...
第三章 字串 向量和陣列
1 以命名空間std為例,兩種宣告方式 1 using std cin 或cout,endl等 2 using namespace std 2 標頭檔案中不應包含using宣告。1 初始化的方式分為拷貝初始化 使用等號 與直接初始化 不使用等號 1 使用getline讀取一整行 直接讀只會讀乙個單詞...
第三章 字串 向量和陣列
標頭檔案 include string定義和初始化 string s1 string s1 s2 string s1 hello string s1 hello string s1 n,c string物件的操作 cin s1 cout cin,s1 s.empty s.size s n s1 s2...