迭代器是的作用类似于指针,最常用于STL中用于遍历容器,其定义于头文件 iterator 中。
使用方式:
auto li = initializer_list<string>({ "this ","is ","test" });
for (auto it = li.begin(); it != li.end(); it++)
{
o_word << *it;
}
1.插入迭代器
back_inserter
用于创建一个使用push_back的迭代器。
vector<int> vec;
auto it=back_inserter(vec);//通过它赋值会将元素添加到vec中
*it=10;//将10加入到vec中。
fill_n(back_inserter(vec),10,0);//向vec中添加10个0;
fron_inserter
创建一个使用push_front的迭代器。
list<int> vec;
auto it = front_inserter(vec);//通过它赋值会将元素添加到vec中
*it = 10;//将10加入到vec中。
*it = 15;
for (auto it = vec.begin(); it != vec.end(); it++)
{
cout<< *it;
}
inserter
创建一个使用insert的迭代器,此函数接受的第二参数为指向容器的迭代器,inserter将值插入到迭代器的前面。
list<int>li = {5,20,30,40};
auto pos = li.begin();
pos++;
auto in = inserter(li,pos);
*in = 10;
*in = 15;
*in = 25;
//插入后元素的序列为:5 10 15 25 20 30 40
2.iostream迭代器
IO类型的迭代器可用于操作IO对象,istream_iterator用于读取数输入流,ostream_iterator用于向输出流写数据。
istream_iterator
istream_iterator使用时不许和一个将要读取的对向进行绑定,如果使用默认的初始化方式则会创建一个尾后值使用的迭代器。
istream_iterator<int>int_it(cin)//从cin读取int
istream_iterator<int>int_eof;//尾后迭代器
ifstream in("file");
istream_iterator<string> str_it(in);//从“afile“读取字符串
对于一个绑定了的io迭代器,当遇到文件尾或者遇到IO错误时,迭代器的值就和尾后迭代器的值相等。不如我们读取int数据时遇到char就会发生错误,此时迭代器的值等于尾后迭代器的值。
vector<int>vec;
istream_iterator<int> in_iter(cin);
istream_iterator<int>eof;
while (in_iter != eof)
{
vec.push_back(*in_iter++);
}
从键盘向迭代器中输入数据。
对于vector而言还可以用流迭代器范围的方式来进行构造。
istream_iterator<int>eof;
istream_iterator<int> in_iter(cin);
vector<int>vec(in_iter,eof);
istream_iterator的更多操作
使用泛型算法操作流迭代器
istream_iterator<int>eof;
istream_iterator<int> in_iter(cin);
cout << accumulate(in_iter, eof, 0) << endl;
istream_iterator
我们可以对任何具有输出运算符的类型定义ostream_iterator
常见操作:
用于输出到终端:
ostream_iterator<int> out_iter(cout, " ");
vector<int>vec = { 1,5,8,9,5,6,4,5 };
for (auto e: vec) {
*out_iter++ = e;
}
事实上我们在向out_iter时可以忽略,建议不省略,和其他迭代器保持一致。
ostream_iterator<int> out_iter(cout, " ");
vector<int>vec = { 1,5,8,9,5,6,4,5 };
for (auto e: vec) {
out_iter = e;
}
使用copy()来打印数据将会跟简单
ostream_iterator<int> out_iter(cout, " ");
vector<int>vec = { 1,5,8,9,5,6,4,5 };
copy(vec.begin(), vec.end(), out_iter);
3.反向迭代器
反向迭代器的操作和普通的操作是反向的,比如执行it++
在反向迭代器中会移动到前一个元素,it--
在反向迭代器中会移动到后一个元素。
除了forward_list之外的容器都支持反向迭代器,通过使用rbegin()、rend、crbegin、crend
来获得反向迭代器。反向迭代器也有const和非const版本。
vector<int>vec = { 1,5,8,9,5,6,4,5 };
//反向打印vec中的数据
for (auto it = vec.crbegin(); it != vec.crend();it++) {
cout << *it << " ";
}
反向迭代器用于排序
sort(vec.begin(),vec.end());//升序排序
sort(vec.rbegin(),vec.rend());//降序排序
不能在forward_list或者流迭代器中创建反向迭代器
如果我们想要在在一个字符中打印最后一个单词,我们使用反向迭代器操作:
string line = "this is a test of reverse_iterator";
auto last = find(line.crbegin(),line.crend(),' ');//last指向最后一个单词前的空格
cout << string(line.crbegin(), last) << endl;
运行结果是这样的:rotareti_esrever 他是逆序输出的,原因就是我们使用的是反向迭代器构造字符串。为了将反向迭代器装转变成普通的迭代器,我们需要调用base() 函数将其转换成为正向的迭代器。
cout << string(last.base(),line.cend()) << endl;//打印最后一个单词