C++学习笔记----迭代器(iterator、back_inserter、fron_inserter、istream_iterator等)


迭代器是的作用类似于指针,最常用于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;//打印最后一个单词
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值