C++之STL叠代器
阿新 • • 發佈:2018-06-21
初始 自身 sig 10個 sso emp 是把 由於 val
叠代器類型可使用解引用操作符(dereference operator)(*)來訪問叠代器所指向的元素:
叠代器使用自增操作符向前移動叠代器指向容器中下一個元素。從邏輯上說,叠代器的自增操作和 int 型對象的自增操作類似。對 int 對象來說,操作結果就是把 int 型值“加 1”,而對叠代器對象則是把容器中的叠代器“向前移動一個位置”。因此,如果 iter 指向第一個元素,則 ++iter 指向第二個元素。 由於 end 操作返回的叠代器不指向任何元素,因此不能對它進行解引用或自增操作。
另一對可執行於叠代器的操作就是比較:用 == 或 != 操作符來比較兩個叠代器,如果兩個叠代器對象指向同一個元素,則它們相等,否則就不相等。
當我們對普通 iterator 類型解引用時,得到對某個元素的非 const。而如果我們對 const_iterator 類型解引用時,則可以得到一個指向 const 對象的引用),如同任何常量一樣,該對象不能進行重寫。 如果使用const_itreator進行重寫,編譯時會報錯! 使用 const_iterator 類型時,我們可以得到一個叠代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對叠代器進行自增以及使用解引用操作符來讀取值,但不能對該元素賦值。 【註意:不要把 const_iterator 對象與 const 的 iterator 對象混淆起來。聲明一個 const 叠代器時,必須初始化叠代器。一旦被初始化後,就不能改變它的值。】
叠代器是一種檢查容器內元素並遍歷元素的數據類型。可以替代下標訪問vector對象的元素。
每種容器類型都定義了自己的叠代器類型,如 vector:
- vector<int>::iterator iter;
這符語句定義了一個名為 iter 的變量,它的數據類型是 vector<int> 定義的 iterator 類型。每個標準庫容器類型都定義了一個名為 iterator 的成員,這裏的 iterator 與叠代器實際類型的含義相同。
begin 和 end 操作
每種容器都定義了一對命名為 begin 和 end 的函數,用於返回叠代器。如果容器中有元素的話,由 begin 返回的叠代器指向第一個元素:- vector<int>::iterator iter = ivec.begin();
vector 叠代器的自增和解引用運算
- *iter = 0;
叠代器使用自增操作符向前移動叠代器指向容器中下一個元素。從邏輯上說,叠代器的自增操作和 int 型對象的自增操作類似。對 int 對象來說,操作結果就是把 int 型值“加 1”,而對叠代器對象則是把容器中的叠代器“向前移動一個位置”。因此,如果 iter 指向第一個元素,則 ++iter 指向第二個元素。 由於 end 操作返回的叠代器不指向任何元素,因此不能對它進行解引用或自增操作。
叠代器的其他操作
叠代器應用的程序示例
1、使用叠代器和下標改變vector的內容
這個很簡單,請看代碼。- #include <iostream>
- #include <string>
- #include <vector>
- int print_int_vector(std::vector<int> ivec)
- {
- for(std::vector<int>::size_type ix =0, j = 0; ix != ivec.size(); ++ix, ++j)
- {
- std::cout<<ivec[ix]<<" "; //加空格!
- }
- std::cout<<std::endl;
- return 0;
- }
- int main()
- {
- std::vector<int> ivec(10, 68); // empty vector
- print_int_vector(ivec);
- // reset all the elements in ivec to 0
- /*
- // 使用下標
- for (std::vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
- {
- ivec[ix] = 0;
- }
- */
- // equivalent loop using iterators to reset all the elements in ivec to 0
- for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
- *iter = 0; // set element to which iter refers to 0
- print_int_vector(ivec);
- return 0;
- }
2、tuple功能的實現【不可變性】
const_iterator類型只能用於讀取容器內元素,但不能改變其值。當我們對普通 iterator 類型解引用時,得到對某個元素的非 const。而如果我們對 const_iterator 類型解引用時,則可以得到一個指向 const 對象的引用),如同任何常量一樣,該對象不能進行重寫。 如果使用const_itreator進行重寫,編譯時會報錯! 使用 const_iterator 類型時,我們可以得到一個叠代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對叠代器進行自增以及使用解引用操作符來讀取值,但不能對該元素賦值。 【註意:不要把 const_iterator 對象與 const 的 iterator 對象混淆起來。聲明一個 const 叠代器時,必須初始化叠代器。一旦被初始化後,就不能改變它的值。】
- vector<int> nums(10); // nums is nonconst
- const vector<int>::iterator cit = nums.begin();
- *cit = 1; // ok: cit can change its underlying element
- ++cit; // error: can‘t change the value of cit
總結
1、const_iterator需要註意:這個vector本身還是可變的,只不過對const_iterator類型解引用的對象不可變。 2、const叠代器也就是只能指向其所指向的元素,不能通過++等操作去指向其他元素。但是,所指向這個元素可以改變。 3、需要定義真正tuple,那就用const vector<int> nums(10, 9);來定義!此時,必須使用const_iterator 來獲取每個元素的值。叠代器的算術操作
1、可以對叠代器對象加上或減去一個整形值。這樣做將產生一個新的叠代器,其位置在 iter 所指元素之前(加)或之後(減) n 個元素的位置。加或減之後的結果必須指向 iter 所指 vector 中的某個元素,或者是 vector 末端的後一個元素。加上或減去的值的類型應該是 vector 的 size_type 或 difference_type 類型,例子:- int main()
- {
- std::vector<int> ivec(10, 68);
- print_int_vector(ivec);
- int i = 0;
- for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter, i++)
- *iter = i; // set element to which iter refers to i
- print_int_vector(ivec);
- std::vector<int>::iterator iter = ivec.begin();
- iter += 100;
- std::cout<<*iter;
- return 0;
- }
- vector<int>::iterator mid = vi.begin() + vi.size() / 2;
- *iter = i; // set element to which iter refers to i
- ivec.push_back(i*2);
- {
- *iter = i; // set element to which iter refers to i
- ivec.push_back(i*2);
- }
C++之STL叠代器