首先看圖

代碼:
//
test.cpp : 定義控制台應用程序的入口點。
// C++程序設計
// 2015-5-4
// STL strandard template libeary
#include " stdafx.h "
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
using namespace std;
int _tmain( int argc, _TCHAR* argv[])
{
// 演示泛型指針和copy函數的例子
double a[] = { 1.1, 4.4, 3.3, 2.2 };
vector< double> va(a, a + 4); // 初始化並定義va
typedef vector< double>::iterator vi;
vi first = va.begin(); // 自定義一個正向泛型指針first並指向va的首元素
for (first; first < va.end(); first++) // 正向輸出va
cout << *first << " ";
cout << endl;
// 循環逆向輸出va
for (--first; first>va.begin(); first--) //不做va.begin()-1
{
cout << *first << " ";
if (first == va.begin()+ 1) //當指針到達being()后一個地址時,同時輸出begin()地址上的值
cout << *(first- 1) << " ";
}
cout << endl;
copy(va.begin(), va.end(), ostream_iterator< double>(cout, " ")); // 整體正向輸出va
cout << endl;
typedef vector< double>::reverse_iterator vri;
vri last = va.rbegin();
// 使用逆向指針循環從尾到首輸出va
for (last; last<va.rend(); last++)
{
cout << *last << " ";
}
cout << endl;
// 使用逆向指針循環從首到尾輸出va
for (--last; last>va.rbegin(); last--)
{
cout << *last << " " ;
if (last == va.rbegin() + 1) //當指針到達rbeing()前一個地址時,同時輸出rbegin()地址上的值
cout << *(last - 1) << " ";
}
cout << endl;
copy(va.rbegin(), va.rend(), ostream_iterator< double>(cout, " ")); // 整體從尾到首輸出va
cout << endl;
return 0;
// C++程序設計
// 2015-5-4
// STL strandard template libeary
#include " stdafx.h "
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
using namespace std;
int _tmain( int argc, _TCHAR* argv[])
{
// 演示泛型指針和copy函數的例子
double a[] = { 1.1, 4.4, 3.3, 2.2 };
vector< double> va(a, a + 4); // 初始化並定義va
typedef vector< double>::iterator vi;
vi first = va.begin(); // 自定義一個正向泛型指針first並指向va的首元素
for (first; first < va.end(); first++) // 正向輸出va
cout << *first << " ";
cout << endl;
// 循環逆向輸出va
for (--first; first>va.begin(); first--) //不做va.begin()-1
{
cout << *first << " ";
if (first == va.begin()+ 1) //當指針到達being()后一個地址時,同時輸出begin()地址上的值
cout << *(first- 1) << " ";
}
cout << endl;
copy(va.begin(), va.end(), ostream_iterator< double>(cout, " ")); // 整體正向輸出va
cout << endl;
typedef vector< double>::reverse_iterator vri;
vri last = va.rbegin();
// 使用逆向指針循環從尾到首輸出va
for (last; last<va.rend(); last++)
{
cout << *last << " ";
}
cout << endl;
// 使用逆向指針循環從首到尾輸出va
for (--last; last>va.rbegin(); last--)
{
cout << *last << " " ;
if (last == va.rbegin() + 1) //當指針到達rbeing()前一個地址時,同時輸出rbegin()地址上的值
cout << *(last - 1) << " ";
}
cout << endl;
copy(va.rbegin(), va.rend(), ostream_iterator< double>(cout, " ")); // 整體從尾到首輸出va
cout << endl;
return 0;
}
不能將for (--first; first>va.begin(); first--) 或 for (--last; last>va.rbegin(); last--) 中的
va.begion()-1 或 va.rbegin()-1,原因是fisrt指針,它們的在數組中的作用范圍各自是[begion,end)與(rend,rbegion]
就是說:正向泛型指針逆向循環時,a.begin以外的范圍。所以代碼中-1會心指針繼續做first--,到此報錯Expreeeion:vector iterator + offset out of range。
逆向泛型指針同理。
