我是靠谱客的博主 伶俐钢笔,这篇文章主要介绍[C/C++]_[初级]_[关于OutputIterator的简单介绍]场景说明例子参考,现在分享给大家,希望可以做个参考。

场景

1.我们在使用算法库时, 免不了需要对集合进行排序, 复制, 移动等, 而对集合的元素进行操作就需要用到枚举(itereator).

2.我们一般是对已存在的集合进行遍历, 删除, 但是如果需要复制一个集合A内的元素到一个集合B内时如何操作, 这时候枚举怎么使用? 用枚举能很方便进行多元素添加, 而不需要使用效率低下的 for 循环.

说明

1.Iterator可以理解为一种可以对集合的元素进行标识和来回移动的类型, 也可以理解为一个抽象的指针. 它包括5 种类型的枚举: InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator, 和 RandomAccessIterator; 如果是C++17 还包含一种类型 ContiguousIterator.

2.OutputIterator 是一种枚举, 它可以写入指向的元素. ForwardIterator, BidirectionalIterator, 或者 RandomAccessIterator 都是 OutputIterator的一种. OutputIterator 满足我们最常用的几种操作:

3.std::back_inserter 能快速的创建一个通过容器push_back函数添加元素的枚举, 当然容器要有push_back函数.

4.std::inserter 能快速的创建一个通过容器的insert函数添加元素的枚举, 当然容器要有insert函数, 没有编译报错.

复制代码
1
2
3
4
*r = o // 这个比较特殊, r首先解引用后赋值, 之后r递增1, 指向下一个元素位置. ++r r++ *r++ = o

例子

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <assert.h> #include <iostream> #include <utility> #include <iterator> #include <set> #include <typeinfO> template <class A> static void PrintArray(A& a) { std::cout << typeid(a).name() << std::endl; if(a.begin() == a.end()) return; auto ite = a.begin(); std::cout << "("; std::cout << *ite; ite++; for(; ite != a.end();++ite){ std::cout << "," << *ite; } std::cout << ")" << std::endl; } void TestIterator() { std::vector<int> v; // back_insert_iterator 的用法, operator= 插入一个数据, 因为是back枚举, 每次都会调用 // container的push_back函数. auto& itev = std::back_inserter(v); itev = 1; itev = 2; itev = 3; itev = 4; itev = 5; itev = 5; PrintArray(v); std::vector<int> f; f.push_back(-1); f.push_back(-2); f.push_back(-3); PrintArray(f); // 复制 v内的数组到f, 从f的第2个位置开始. std::copy(v.begin(),v.end(),std::inserter(f,std::next(f.begin()))); PrintArray(f); // 复制vector到set, 过滤掉重复的. // std::inserter 每次都会调用容器的insert函数. std::set<int> s; std::copy(v.begin(), v.end(),std::inserter(s,s.begin())); PrintArray(s); std::vector<int> result; std::sort(v.begin(),v.end()); std::sort(f.begin(),f.end()); // 获取两个集合的差集 // 如果直接使用 result.begin()的话会崩溃, // vector iterator not incrementable; // 因为 result.begin()不是OutputIterator, iterator不可以递增,result本身没有元素. //std::set_difference(f.begin(),f.end(),v.begin(),v.end(),result.begin()); std::set_difference(f.begin(),f.end(),v.begin(),v.end(),std::back_inserter(result)); PrintArray(result); }

输出:

复制代码
1
2
3
4
5
6
7
8
9
10
class std::vector<int,class std::allocator<int> > (1,2,3,4,5,5) class std::vector<int,class std::allocator<int> > (-1,-2,-3) class std::vector<int,class std::allocator<int> > (-1,1,2,3,4,5,5,-2,-3) class std::set<int,struct std::less<int>,class std::allocator<int> > (1,2,3,4,5) class std::vector<int,class std::allocator<int> > (-3,-2,-1)

参考

OutputIterator
concept-Iterator
iterator
back_inserter
insert_iterator
inserter
next
copy

最后

以上就是伶俐钢笔最近收集整理的关于[C/C++]_[初级]_[关于OutputIterator的简单介绍]场景说明例子参考的全部内容,更多相关[C/C++]_[初级]_[关于OutputIterator内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部