STL 常用 算法/函数
v中的数据一次输出
1.
#define VSIZE 24 // Size of vector
vector<long> v(VSIZE); // Vector object
void show(const long &ri){ cout << ri << " ";}
for_each(v.begin(), v.end(), show);
2.
copy(v.begin(), v.end(),ostream_iterator<int>(cout, "\t"));
插入迭代器
插入迭代器用于将值插入到容器中。它们也叫做适配器,因为它们将容器适配或转化为一个迭代器,并用于copy()这样的算法中。例如,一个程序定义了一个链表和一个矢量容器:
通过使用front_inserter迭代器对象,可以只用单个copy()语句就完成将矢量中的对象插入到链表前端的操作:
三种插入迭代器如下:
·
普通插入器 将对象插入到容器任何对象的前面。
·
Front
inserters
将对象插入到数据集的前面——例如,链表表头。
·
Back
inserters
将对象插入到集合的尾部——例如,矢量的尾部,导致矢量容器扩展。
使用插入迭代器可能导致容器中的其他对象移动位置,因而使得现存的迭代器非法。例如,将一个对象插入到矢量容器将导致其他值移动位置以腾出空间。一般来说,插入到象链表这样的结构中更为有效,因为它们不会导致其他对象移动。
Listing 5. insert.cpp
运行结果如下:
可以将front_inserter替换为back_inserter试试。
如果用find()去查找在列表中不存在的值,例如99。由于这时将p设置为past-the-end
值。最后的copy()函数将iArray的值附加到链表的后部。
混合迭代器函数
在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:
·
advance()
按指定的数目增减迭代器。
·
distance()
返回到达一个迭代器所需(递增)操作的数目。
例如:
advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。
注意
distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数。未初始化该参数几乎注定要失败。