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()这样的算法中。例如,一个程序定义了一个链表和一个矢量容器:

list<double> dList;vector<double> dVector;

通过使用front_inserter迭代器对象,可以只用单个copy()语句就完成将矢量中的对象插入到链表前端的操作:

copy(dVector.begin(), dVector.end(), front_inserter(dList));

三种插入迭代器如下:


·       
普通插入器 将对象插入到容器任何对象的前面。


·       
Front
inserters

将对象插入到数据集的前面——例如,链表表头。


·       
Back
inserters

将对象插入到集合的尾部——例如,矢量的尾部,导致矢量容器扩展。


使用插入迭代器可能导致容器中的其他对象移动位置,因而使得现存的迭代器非法。例如,将一个对象插入到矢量容器将导致其他值移动位置以腾出空间。一般来说,插入到象链表这样的结构中更为有效,因为它们不会导致其他对象移动。


Listing 5. insert.cpp

#include <iostream.h>#include <algorithm>#include <list> using namespace std; int iArray[5] = { 1, 2, 3, 4, 5 }; void Display(list<int>& v, const char* s); int main(){  list<int> iList;   // Copy iArray backwards into iList  copy(iArray, iArray + 5, front_inserter(iList));  Display(iList, "Before find and copy");   // Locate value 3 in iList  list<int>::iterator p =    find(iList.begin(), iList.end(), 3);   // Copy first two iArray values to iList ahead of p  copy(iArray, iArray + 2, inserter(iList, p));  Display(iList, "After find and copy");   return 0;} void Display(list<int>& a, const char* s){  cout << s << endl;  copy(a.begin(), a.end(),    ostream_iterator<int>(cout, " "));  cout << endl;}

运行结果如下:

$ g++ insert.cpp$ ./a.outBefore find and copy5 4 3 2 1After find and copy5 4 1 2 3 2 1

可以将front_inserter替换为back_inserter试试。


如果用find()去查找在列表中不存在的值,例如99。由于这时将p设置为past-the-end
值。最后的copy()函数将iArray的值附加到链表的后部。


混合迭代器函数


在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:


·       
advance()
按指定的数目增减迭代器。


·       
distance()
返回到达一个迭代器所需(递增)操作的数目。


例如:

list<int> iList;list<int>::iterator p =  find(iList.begin(), iList.end(), 2);cout << "before: p == " << *p << endl;advance(p, 2);  // same as p = p + 2;cout << "after : p == " << *p << endl; int k = 0;distance(p, iList.end(), k);cout << "k == " << k << endl; 

advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。

使用 distance()函数来返回到达另一个迭代器所需要的步骤。

注意


distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数。未初始化该参数几乎注定要失败。

posted @ 2009-07-04 12:36  狼窝  阅读(305)  评论(0编辑  收藏  举报