C++泛型指針的正向與逆向循環讀取時報錯Expreeeion:vector iterator + offset out of range問題


首先看圖

 

代碼:

//  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.14.43.32.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。 

逆向泛型指針同理。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM