STL迭代器的应用
- 迭代器的定义方法:
类型 | 作用 | 定义方式 |
---|---|---|
正向迭代器 | 正序遍历STL容器 | 容器类名::iterator 迭代器名 |
常量正向迭代器 | 以只读方式正序遍历STL容器 | 容器类名::const_iterator 迭代器名 |
反向迭代器 | 逆序遍历STL容器 | 容器类名::reverse_iterator 迭代器名 |
常量反向迭代器 | 以只读方式逆序遍历STL容器 | 容器类名::const_reverse_iterator 迭代器名 |
-
迭代器与自动类型推导:C++11引入了
auto
关键字,用于自动类型推导,可简化记忆复杂的数据类型名,自动类型推导要求变量必须进行初始化。语法为auto 变量名=值
。 -
迭代器本身不支持输入和输出,因此不能像指针一样输出查看其地址。
-
在对迭代器所指向的元素进行操作时,必须像指针一样,对迭代器进行解引用操作,即
*迭代器名
。若对迭代器指向的元素进行修改,则与指针一样,其实际的值也会被修改。 -
特殊位置的迭代器:
类名.begin()
:正向迭代器,指向容器正向上首个位置的迭代器
类名.cbegin()
:常量正向迭代器,其余与begin相同类名.end()
:正向迭代器,指向容器正向上末个位置的下一个位置的迭代器
类名.cend()
:常量正向迭代器,其余与end相同类名.rbegin()
:反向迭代器,指向容器反向上首个位置的迭代器
类名.crbegin()
:常量反向迭代器,其余与rbegin相同类名.rend()
:反向迭代器,指向容器反向上末个位置的下一个位置的迭代器
类名.crend()
:常量反向迭代器,其余与rend相同
-
迭代器与指针一样,支持算数运算。迭代器的算数运算具有方向性:在进行算数运算时,运算方向沿着迭代器的方向。
如正向迭代器进行++时,为沿着正向进行++,即移动到当前迭代器的下一个位置;反向迭代器进行++时,为沿着反向进行++,相对于正向而言,实际是移动到了当前的前一个位置。
-
获取迭代器的位置:使用
std::distance(迭代器1,迭代器2)
,为迭代器2-迭代器1。 -
基于范围的for循环:C++11引入了基于范围的for循环,用于更简便的正序遍历容器(包括C数组),但不支持逆序遍历容器。在基于范围的for循环中,循环变量就是元素本身,无需再进行解引用操作。若需要在基于范围的for循环中对元素进行修改,可与引用进行配合使用。循环头的语法为:
for (auto element : container) {//element直接表示容器中的每一个元素,无需再进行解引用。container既可以为STL序列容器,也可以是C数组 } for (auto &element : container) {//element表示容器中的每一个元素的引用,通过修改引用可直接修改容器内元素 }
迭代器应用实例
此处仅为说明迭代器作用而举例,实际上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循环
vector<int>v(10);
for(auto &i:v){cin>>i;
}
for(auto i:v){cout<<i;
}
- 基于范围的for循环(C数组)
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循环
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循环(C数组)
int a[3][3];
for(auto &j:a)for(auto &i:j)cin>>i;
for(auto &j:a)for(auto i:j)cout<<i;