STL迭代器back_insert_iterator、front_insert_iterator和insert_iterator

13 篇文章 1 订阅

模板使得算法独立于存储的数据类型。
迭代器使得算法独立于使用的容器类型。

迭代器类型

  • 输入迭代器
  • 输出迭代器
  • 正向迭代器
  • 双向迭代器
  • 随机访问迭代器
    迭代器具有层级结构:
  • 正向迭代器具有输入输出迭代器的全部功能,同时有自己的功能。
  • 双向迭代器具有输入输出迭代器的全部功能,同时还有自己的功能。
  • 随机访问迭代器具有正向迭代器的全部功能,同时还有自己的功能。
    每个容器都定义了一个类级typedef名称–iterator,因此vector< int >类的迭代器类型为vector< int >::iterator,该迭代器为随机迭代器,具有所有迭代器的功能。而list< int >::iterator为双向迭代器。
    STL算法可以使用任何满足其要求的迭代器实现。
    指向int类型的常规指针是一个随机访问随机迭代器模型。

将指针用作迭代器

迭代器是广义指针,而指针满足所有迭代器的要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作,例如,可将STL算法用于数组。
C++将超尾的概念用于数组,使得可以将STL算法用于常规数组。

输出迭代器之ostream_iterator

#include< iterator >

	ostream_iterator<int, char> out_int(cout, " ");

out_int迭代器现在是一个接口,

  • 第一个模板参数(int)指出了被发送到输出流的数据类型;
  • 第二个参数(char)指出了输出流使用的字符类型(另一个可用的是wchar_t)。
  • 构造函数的第一个参数(cout)指出了要使用的输出流
  • 最后一个字符串参数是在发送给输出流的每个数据项之间的分隔符。
#include <iostream>
#include<algorithm>
#include<iterator>
#include<string>
#include<vector>
using namespace std;

int main(void) {
	int nums[] = {22,3,5,1,9,0,-9,99,-20};
	char chs[] = { 'b','d','a','l','c','e' };
	int len_int = sizeof(nums) / sizeof(int);
	int len_char = sizeof(chs) / sizeof(char);

	//使用sort()函数对数组进行排序
	sort(nums, nums + len_int);
	sort(chs, chs + len_char);


	ostream_iterator<char, char> out_char(cout, " ");
	ostream_iterator<int, char> out_int(cout, " ");
	*out_int++ = 666;//相当于cout<< 666 << " ";
	cout << "" << endl;
	copy(nums, nums + len_int,out_int);//-20 -9 0 1 3 5 9 22 99
	cout << "" << endl;
	copy(chs, chs + len_char, out_char);//a b c d e l

	vector<char> vec(len_char);
	copy(chs, chs + len_char, vec.begin());
	cout << endl << "反向迭代器:" << endl;
	//rbegin和end返回值相同,但是类型不同(reverse_iterator和iterator),同样,rend和begin的返回值相同
	copy(vec.rbegin(), vec.rend(), out_char);
	return 0;
}
结果:
666
-20 -9 0 1 3 5 9 22 99
a b c d e l
反向迭代器:
l e d c b a

插入迭代器(输出迭代器)

  • back_insert_iterator,将元素插到容器末尾,只适用于在尾部快速插入的容器(在尾部插入元素时使用固定时间O(1))
  • front_insert_iterator,将元素插入到容器前端。只适用于在首部快速插入的容器(vector不适用,但list适用)
  • insert_iterator,插入到insert_iterator构造函数的参数的指定的位置前。
#include <iostream>
#include<string>	
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
void output(const string & s) {
	cout << s <<" ";
}
int main(void) {

	string s1[4] = { "fine","fish","fashion","fate" };
	string s2[2] = { "busy","bats" };
	string s3[2] = { "silly","singers" };
	vector<string> words(4);
	copy(s1, s1 + 4, words.begin());
	for_each(words.begin(), words.end(), output);
	cout << "" << endl;

	//back_insert_iterator的构造函数将假设传递给他的类型有一个push_back()方法。
	back_insert_iterator<vector<string> > back_ins(words);
	copy(s2, s2 + 2, back_ins);
	for_each(words.begin(), words.end(), output);
	cout << "" << endl;

	//insert_iterator的构造函数还需要一个指示插入位置的参数
	insert_iterator<vector<string> > ins(words, words.begin()+1);
	copy(s3, s3 + 2, ins);
	for_each(words.begin(), words.end(), output);
	cout << "" << endl;

	return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前插型迭代器front_insert_iteratorSTL中的一种迭代器类型,用于将元素插入容器的头部而不是尾部。它可以适用于所有支持push_front操作的容器,如list和deque等。 使用前提:需要使用一个支持push_front操作的容器,如list或deque。 定义方法:可以通过以下方式定义一个前插型迭代器front_insert_iterator: ``` template <typename Container> class front_insert_iterator { public: // 构造函数,接受一个容器作为参数 explicit front_insert_iterator(Container& x) : container(&x) {} // 重载运算符* front_insert_iterator& operator*() { return *this; } // 重载运算符++ front_insert_iterator& operator++() { return *this; } // 重载运算符++(后缀) front_insert_iterator operator++(int) { return *this; } // 重载运算符= front_insert_iterator& operator=(const typename Container::value_type& value) { container->push_front(value); return *this; } private: Container* container; }; ``` 其中,Container是容器的类型,value_type是容器中存储的元素类型。通过以上定义,就可以使用front_insert_iterator将元素插入容器的头部了。例如,可以通过以下方式将元素插入list的头部: ``` #include <iostream> #include <list> #include <iterator> using namespace std; int main() { list<int> mylist = {1, 2, 3, 4, 5}; front_insert_iterator<list<int>> myfront(mylist); *myfront = 6; ++myfront; *myfront = 7; for (auto i : mylist) { cout << i << " "; } return 0; } ``` 输出结果为:7 6 1 2 3 4 5。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值