用vs怎么做網(wǎng)站的導航seo是什么化學名稱
STL迭代器的應(yīng)用
- 迭代器的定義方法:
類型 | 作用 | 定義方式 |
---|---|---|
正向迭代器 | 正序遍歷STL容器 | 容器類名::iterator 迭代器名 |
常量正向迭代器 | 以只讀方式正序遍歷STL容器 | 容器類名::const_iterator 迭代器名 |
反向迭代器 | 逆序遍歷STL容器 | 容器類名::reverse_iterator 迭代器名 |
常量反向迭代器 | 以只讀方式逆序遍歷STL容器 | 容器類名::const_reverse_iterator 迭代器名 |
-
迭代器與自動類型推導:C++11引入了
auto
關(guān)鍵字,用于自動類型推導,可簡化記憶復雜的數(shù)據(jù)類型名,自動類型推導要求變量必須進行初始化。語法為auto 變量名=值
。 -
迭代器本身不支持輸入和輸出,因此不能像指針一樣輸出查看其地址。
-
在對迭代器所指向的元素進行操作時,必須像指針一樣,對迭代器進行解引用操作,即
*迭代器名
。若對迭代器指向的元素進行修改,則與指針一樣,其實際的值也會被修改。 -
特殊位置的迭代器:
類名.begin()
:正向迭代器,指向容器正向上首個位置的迭代器
類名.cbegin()
:常量正向迭代器,其余與begin相同類名.end()
:正向迭代器,指向容器正向上末個位置的下一個位置的迭代器
類名.cend()
:常量正向迭代器,其余與end相同類名.rbegin()
:反向迭代器,指向容器反向上首個位置的迭代器
類名.crbegin()
:常量反向迭代器,其余與rbegin相同類名.rend()
:反向迭代器,指向容器反向上末個位置的下一個位置的迭代器
類名.crend()
:常量反向迭代器,其余與rend相同
-
迭代器與指針一樣,支持算數(shù)運算。迭代器的算數(shù)運算具有方向性:在進行算數(shù)運算時,運算方向沿著迭代器的方向。
如正向迭代器進行++時,為沿著正向進行++,即移動到當前迭代器的下一個位置;反向迭代器進行++時,為沿著反向進行++,相對于正向而言,實際是移動到了當前的前一個位置。
-
獲取迭代器的位置:使用
std::distance(迭代器1,迭代器2)
,為迭代器2-迭代器1。 -
基于范圍的for循環(huán):C++11引入了基于范圍的for循環(huán),用于更簡便的正序遍歷容器(包括C數(shù)組),但不支持逆序遍歷容器。在基于范圍的for循環(huán)中,循環(huán)變量就是元素本身,無需再進行解引用操作。若需要在基于范圍的for循環(huán)中對元素進行修改,可與引用進行配合使用。循環(huán)頭的語法為:
for (auto element : container) {//element直接表示容器中的每一個元素,無需再進行解引用。container既可以為STL序列容器,也可以是C數(shù)組 } for (auto &element : container) {//element表示容器中的每一個元素的引用,通過修改引用可直接修改容器內(nèi)元素 }
迭代器應(yīng)用實例
此處僅為說明迭代器作用而舉例,實際上vector的I/O方法并不止這些。
一維vector的正序輸入、正序輸出
- 手動定義迭代器
vector<int>v(10);
for(v::iterator i=v.begin();i!=v.end();i++)cin>>*i;//注意必須解引用迭代器,否則會報錯。對迭代器指向的元素進行操作,元素實際值會改變
for(v::iterator i=v.begin();i!=v.end();i++) cout<<*i;
- 自動類型推導定義的迭代器
vector<int>v(10);
for(auto i=v.begin();i!=v.end();i++) cin>>*i;
for(auto i=v.begin();i!=v.end();i++) cout<<*i;
- 基于范圍的for循環(huán)
vector<int>v(10);
for(auto &i:v){cin>>i;
}
for(auto i:v){cout<<i;
}
- 基于范圍的for循環(huán)(C數(shù)組)
int a[10];
for(auto &i:a){cin>>i;
}
for(auto i:a){cout<<i;
}
一維vector的逆序輸入、逆序輸出
- 手動定義迭代器
vector<int>v(10);
for(v::iterator i=v.rbegin();i!=v.rend();i++)cin>>*i;//注意必須解引用迭代器,否則會報錯。對迭代器指向的元素進行操作,元素實際值會改變
for(v::iterator i=v.rbegin();i!=v.rend();i++) cout<<*i;
- 自動類型推導定義的迭代器
vector<int>v(10);
for(auto i=v.rbegin();i!=v.rend();i++) cin>>*i;
for(auto i=v.rbegin();i!=v.rend();i++) cout<<*i;
二維vector的正序輸入、正序輸出
- 手動定義迭代器
vector<vector<int>>v(3,vector<int>(3));
for(vector<vector<int>>::iterator j=v.begin();j!=v.end();j++)for(vector<int>::iterator i=j->begin();i!=j->end();i++)cin>>*i;
for(vector<vector<int>>::iterator j=v.begin();j!=v.end();j++)for(vector<int>::iterator i=j->begin();i!=j->end();i++)cout<<*i;
- 自動類型推導的迭代器
vector<vector<int>>v(3,vector<int>(3));
for(auto j=v.begin();j!=v.end();j++)for(auto i=j->begin();i!=j->end();i++)cin>>*i;
vector<vector<int>>v(3,vector<int>(3));
for(auto j=v.begin();j!=v.end();j++)for(auto i=j->begin();i!=j->end();i++)cout<<*i;
- 基于范圍的for循環(huán)
vector<vector<int>>v(3,vector<int>(3));
for(auto &j:v)for(auto &i:j)cin>>i;
for(auto j:v)for(auto i:v)cout<<i;
- 基于范圍的for循環(huán)(C數(shù)組)
int a[3][3];
for(auto &j:a)for(auto &i:j)cin>>i;
for(auto &j:a)for(auto i:j)cout<<i;