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

逆向泛型指针同理。

时间: 2024-07-29 08:09:16

C++泛型指针的正向与逆向循环读取时报错Expreeeion:vector iterator + offset out of range问题的相关文章

C++泛型指针的正向与逆向循环读取的改进方法

#include "stdafx.h"#include <algorithm>#include <functional>#include <vector>#include <iterator> using namespace std;int _tmain(int argc, _TCHAR* argv[]){    //双向访问的例子    char st[11] = "abcdefghij";    vector<

Sass for循环中编译%时报错解决方案

sass功能强大,特别是支持for循环,节省大量开发时间,但是在开发时遇到一个问题,直接使用%时没有问题,当有变量时再加% 单位在编译时报错: 这样没有问题: @for $width from 0 to 10{ .wp#{$width}{ width:$width px; } } 但是这样就有问题了: @for $width from 0 to 10{ .wp#{$width}{ width:$width%; } } 或者这样: @for $width from 0 to 10{ .wp#{$w

循环读取文件夹中的图片matlab代码

参考:http://blog.csdn.net/guoxiaojie_415/article/details/21317323:http://blog.csdn.net/qikaihuting/article/details/70244416 本篇博文仅针对于循环读取指定文件夹下的图片文件,不涉及深度和层度遍历. Function函数 function [subdirpath] = RangTraversal(strPath) maindir = strPath; //strPath是strin

jmeter ---json几种读取方式,ArrayList循环读取

在之前写过提取json数据格式的文章,这次对jmeter读取json数据格式进行整理. 举例一个接口的response 格式如下: { "data" : { "device_vec" : [ { "agent_version" : "9.7.0.2225", "android_id" : "e3d699cf01620531", "asset_number" : &qu

python3中 for line1 in f1.readlines():,for line1 in f1:,循环读取一个文件夹

1 #-*- encoding:utf-8 -*- 2 3 class loadDatas(object): 4 def __init__(self): 5 self.path='./data' 6 def load_compare(self): 7 l1={} 8 f1=open(self.path+'/95b.txt',encoding='utf-8') 9 l2={} 10 f2=open(self.path+'/05b.txt',encoding='utf-8') 11 f=open(s

windows 和 linux 上 循环读取文件名称的区别和方法

function showGetFileName($type){ $url="/opt/mobile_system/gscdn"; //另一台服务器映射到linux过来的路径. #判断平台类型 if($type=='android'||$type=='ios'||$type=='windows'){ #拼接类型 $url=$url.'/'.$type.'/assets'; #读取该文件 得到所有文件的对象 $handle=opendir($url.".");//这是

jmeter循环读取数据库表中的数据

先创建一个jdbc请求 请求在结果树正确后,添加一个循环控制器,循环次数定义数据库表查询的数量 variables names设置为col,那么如下变量会被设置为: col_#=2 (总行数) col_1=第1列, 第1行 col_2=第1列, 第2行 添加一个计数器用来坐变量拼接 添加请求引用N,使用函数助手 查看结果 jdbc运行结果 查看循环读取的结果 原文地址:https://www.cnblogs.com/only-love-you-519920/p/9135006.html

halcon 数字转字符串实现循环读取图片

1.将字符转换为数字 tuple_number (StringImageIndex,IntImageIndex) 2.将数字转换为字符 tuple_string (IntImageIndex, '0', StringImageIndex) 循环读取图片 Count:=1 for Index := Count to 5 by 1 tuple_string(Index,'0',StringIndex) filename:='x\\xxx\\xxxxx\\'+StringIndex+'.bmp' re

智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客. 三.shared_ptr shared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和赋值将引用计数加1,具体代码如下: template <typename T> class SharedPtr { public: SharedPtr(); SharedPtr(T* ptr); SharedPtr(const SharedPtr<T>& ap); ~Sha