C++中的迭代器和迭代器的辅助函数

一、迭代器的基本概念
1、迭代器不仅仅是指针 可以指向容器中的一个位置,通过迭代器访问这个位置的元素,而不必关心这个位置对应的是真正的物理地址
2、迭代器是算法和容器的“中间人”
3、迭代器对存储在容器中的元素序列进行遍历,提供的访问容器中每个元素的方法
4、指针式迭代器中的一种
5、迭代器是泛化的指针,提供了类似指针的操作(诸如++、*、->运算符)
6、两个迭代器表示一个区间: [p1,p2) 左闭右开,stl算法常以迭代器的区间作为输入,传奇输入数据
二、迭代器的分类:
输入迭代器:可以用来从序列中读取数据 p1 == p2; p1 != p2; *p1; p1->m; *p1++
输出迭代器:允许向序列中写入数据 *p1 = t; *p1++ = t; p1++的返回值不确定
前向迭代器:即是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历 *p1; p1++
双向迭代器:与前向迭代器相似,但是在两个方向上都可以对数据遍历 –p1; p1–
随机访问迭代器:也是双向迭代器,但是能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器 p1 += n; p1 -= n; p1 - p2; p1 比较运算符 p2; p1[n]
例:自定义函数对象:

[cpp] view plain copy

using namespace std;

template
class square
{
public:
T operator()(T &t)
{
return t*t;
}
};

int myfunc(int a)
{
return a + 10;
}
int main()
{
const int N = 5;
vector s(N);
for (int i = 0; i < N; i++)
{
cin >> s[i];
}
transform(s.begin(), s.end(), ostream_iterator(cout, ” “), negate());//negate():取反
//s.begin(), s.end():来源 输入、ostream_iterator(cout, ” “):输出、negate():处理方式(普通函数不要加 (),而函数对象要加 () )
//begin()来源的第一个元素,end():来源的最后徐一个元素的下一个 在双向迭代器中rbegin()是最后一个 rend()是第一个的前一个
//transform(s.begin(), s.end(), ostream_iterator(cout, ” “), myfunc);
//transform(s.begin(), s.end(), ostream_iterator(cout, ” “), square());
cout << endl;

system("pause");  
return 0;  

}
copy 的使用
[cpp] view plain copy

using namespace std;

int main()
{
int myints[] = { 10, 20, 30, 40, 50, 60, 70 };
vector myvector;
vector::iterator it;

myvector.resize(7);   // 为容器myvector分配空间    

//copy用法一:    
//将数组myints中的七个元素复制到myvector容器中    
copy(myints, myints + 7, myvector.begin());  

cout << "myvector contains: ";  
for (it = myvector.begin(); it != myvector.end(); ++it)  
{  
    cout << " " << *it;  
}  
cout << endl;  

//copy用法二:    
//将数组myints中的元素向左移动一位    
copy(myints + 1, myints + 7, myints);   //不能对myints 的内存进行修改  输出的结果是 20 30 40 50 60 70 70  

cout << "myints contains: ";  
for (size_t i = 0; i < 7; ++i)  
{  
    cout << " " << myints[i];  
}  
cout << endl;  

system("pause");  
return 0;  

}
copy的用法3
[cpp] view plain copy

using namespace std;

int main()
{
vector v, k;
v.resize(5);
for (int i = 0; i < 5; i++)
v.push_back(i);
vector::iterator it = v.begin();
vector::iterator itend = v.end();
copy(it, itend, ostream_iterator(cout, ” “)); //error
}
三、输入输出流迭代器:

输入流迭代器:
templateistream_iterator
要求:T类型重载了运算符>>
以输入流为参数构造:
istream_iterator(cin);
istream_iterator(); 指向输入流结束位置

输出流迭代器:
templateostream_iterator
要求:T类型重载了运算符<<
以输入出流为参数构造:
ostream_iterator(cout);
ostream_iterator(cout, 分隔符); 指向输入流结束位置
例:

[cpp] view plain copy

using namespace std;

double square(double x)
{
return x*x;
}
int main()
{
transform(istream_iterator(cin), istream_iterator(), ostream_iterator(cout, ” “), square);//可以一直输入 并且会输出其平方
cout << endl;

system("pause");  
return 0;  

}
//////////////////////////////////////////////

using namespace std;

template

你可能感兴趣的:(C++中的迭代器和迭代器的辅助函数)