C++:迭代器记录
(1)為什么要引入迭代器:
? ? ? ? ?? 我們知道在使用指針的時候指針可以用來遍歷存儲空間連續的數據結構;但是我們還有一些存儲空間是不連續的,就需要尋找一個行為類似指針的類,來對非數組的數據結構進行遍歷。
(2)什么是迭代器:
? ? ? ? ? ?? 迭代器:就是不停的在執行一些操作(類似于循環吧)。可以用它來訪問可迭代序列;通常其從序列的第一個元素開始訪問,直到所有的元素都被訪問才結束。因此,迭代器是一種檢查容器內元素并遍歷元素的數據類型。
迭代器提供對一個容器中的對象的訪問方法,并且定義了容器中對象的范圍。?
(3)使用迭代器帶來的便利性:
使用迭代器的好處是:使用迭代器不要求事先準備好整個迭代過程中的所有元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之后元素可以不存在或者被銷毀。因此迭代器適合遍歷一些數量巨大甚至無限的序列。
(4)定義與使用:
格式:(容器有成員begin和end,其中begin成員復制返回指向第一個元素的迭代器,而end成員返回指向容器尾元素的下一個位置的迭代器,也就是說end指示的是一個不存在的元素,所以end返回的是尾部之后的迭代器。)
容器::iterator iter;
for(iter= 容器.begin();iter!=容器.end();iter++)
{
cout<<*iter或者是 iter->first等等之類的 //迭代器就是這么個套路
}
如vector:vector< int>:: iterator iter;//定義一個名為iter的變量,數據類型是由vector< int>定義的iterator 類型。簡單說就是容器類定義了自己的iterator類型,用于訪問容器內的元素。每個容器定義了一種名為iterator的類型,這種類型支持迭代器的各種行為。?
PS:每種容器類型都定義了自己的迭代器類型。
迭代器iterator 提供了一種一般化的方法對順序或關聯容器類型中的每個元素進行連續訪問
例如,假設iter為任意容器類型的一個iterator,則++iter 表示向前移動迭代器使其指向容器的下一個元素,而*iter 返回iterator 指向元素的值,每種容器類型都提供一個begin()和一個end()成員函數。其中begin()返回一個iterator 它指向容器的第一個元素;end()返回一個iterator 它指向容器的末元素的下一個位置(就是上邊說的尾部元素之后的未知);通過迭代器,我們可以用相同的方式來訪問、遍歷容器。
下面列舉了些例子說明各個容器的用法:
1.Vector()
#include <iostream>
#include <vector>
int main()
{std::vector<char> charVector;int x;for (x = 0; x<10; ++x){charVector.push_back(65 + x);//A的ASCII碼數值是65;J對應的是74}int size = charVector.size();for (x = 0; x<size; ++x){std::vector<char>::iterator start = charVector.begin();charVector.erase(start);//c.erase(p)從c容器中刪除迭代器p指定的元素,p必須指向c中的一個真實元素,不能等于c.end()此處依次進入for循環的時候刪除start對應的第一個元素std::vector<char>::iterator iter;for (iter = charVector.begin(); iter != charVector.end(); iter++){std::cout << *iter;}std::cout << std::endl;}return 0;
}
結果輸出:
此處插入一個如何刪除容器中元素的函數,包括順序容器和關聯容器。就是上述中的erase()函數。
c.erase(p)//從c中刪除迭代器p指定的元素,p必須指向c中的一個真實元素,不能等于c.end(),因為c.end()元素不存在。
c.erase(b,e)//從c中刪除迭代器對b和e所表示的范圍中的元素。
實際上,erase函數本來是用來操作string的,函數原型如下:
(第一種用法)string& erase ( size_t pos = 0, size_t n = npos );刪除從pos開始的n個字符,比如erase(0,1)就是刪除第一個字符
(第二種用法)iterator erase ( iterator position );刪除position處的一個字符(position是個string類型的迭代器)
(第三種用法)iterator erase ( iterator first, iterator last );刪除從first到last之間的字符(first和last都是迭代器)
// 第二種用法
vector<string> e = {"a","b","c","d","e","f","g"};
auto it = e.end()-1; //.end()指向末尾的下一個元素,因此需要-1,指向末尾元素
e.erase(it); //刪除末尾元素“g”
// 第三種用法
auto it2 = e.begin()+1;
auto it3 = e.end()-2;
e.erase(it2,it3); //刪除it2到it3之間的元素
//第三種用法的擴展
auto it = e.begin();
auto it2 = find(e.begin(), e.find(), "c"); //it2指向“c”所在位置
auto it3 = e.erase(it,it2); //刪除it到it2之間的所有元素,即“a”和“b”;因為it2所指向的是c的位置,但是erase()函數不包括it2。
e.erase(it3); //此時刪除的是“c”,即先前it2所指,因為第三種用法返回的就是第二個迭代器所指位置(理解是因為it3刪除了a,b所以目前指向的是c的位置。)
//第一種用法
string str ("This is an example phrase.");
str.find("an");
str.erase(10); // 也可以使用下標進行刪除操作,刪除下標10開始及以后的字符
str.erase (10,8); // 此處意為刪除下標‘10’開始的連續8個字符//第一個參數表示的是下標值“10”!不是第10個!
2.deque(隊列的操作特性是先進先出(FIFO即First-In-First-Out)意思就是先進去的先出來,例如:一排人走過道,從這頭走到另一頭,肯定是走在最前面的人先出去嘛)
隊列的順序實現是指分配一塊連續的存儲單元存放隊列中的元素,并設兩個指針:隊頭指針front和隊尾指針rear。
#include <iostream>
#include <deque>
int main()
{std::deque<char> charDeque;//隊列int x;for (x = 0; x < 10; ++x){charDeque.push_front(65 + x);//從字面可以看出這個函數和push_back相反,它是在容器開頭增加新的元素,因為容器特性的原因,有些不支持這個操作,比如vector,因為執行效率的原因(時間復雜度)。而list則支持這個操作} int size = charDeque.size();for (x = 0; x<size; ++x){std::deque<char>::iterator start =charDeque.begin();charDeque.erase(start);//刪除std::deque<char>::iterator iter;for (iter = charDeque.begin();iter != charDeque.end(); iter++){std::cout << *iter;}std::cout << std::endl;}return 0;
}
結果輸出:
?
參考:https://blog.csdn.net/qq_23100787/article/details/51388163
?
總結
- 上一篇: C++:求极值的 min_element
- 下一篇: VTK