iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++索引越界的解决方法
  • 483
分享到

C++索引越界的解决方法

2024-04-02 19:04:59 483人浏览 安东尼
摘要

目录1. 动态数组2.静态数组避免"索引越界"错误的规则如下(针对c++): 不要使用静态或动态分配的数组,改用array或vector模板 不要使用带方括号的ne

避免"索引越界"错误的规则如下(针对c++):

  • 不要使用静态或动态分配的数组,改用array或vector模板
  • 不要使用带方括号的new和delete操作符,让vector模板为多个元素分配内存
  • 使用scpp::vector代替std::vector,使用scpp::array代替静态数组,并打开安全检查(自动在使用下标访问提供了索引边界检查)

C++中创建类型T的对象的数组方式如下:


#define N 10
T static_arr[N]; //数组长度在编译时已知

int n=20;
T* dynamic_arr=new T[n]; //数组长度在运行时计算

std::vector<T> vector_arr; //数组长度在运行时进行修改

1. 动态数组

  采用的办法是继承std::vector<T>,并重载<< 、[]运算符,提供一个能够捕捉越界访问错误的实现。

  实现代码和测试如下:


//scpp_vector.h
#ifndef  _SCPP_VECTOR_
#define  _SCPP_VECTOR_

#include <vector>
#include "scpp_assert.h"

namespace scpp {

    //wrapper around std::vector,在[]提供了临时的安全检查:重载[] <<运算符
    template<typename T>
    class vector : public std::vector<T> {
        public:
             typedef unsigned size_type;

             //常用的构造函数 commonly use cons
             explicit vector(size_type n=0) : std::vector<T>(n) {

             }
             vector(size_type n,const T& value) : std::vector<T>(n,value) {

             }

             template <class InputIterator> vector(InputIterator first,InputIterator last) 
                 : std::vector<T>(first,last) {

             }
             
             //Note : we don't provide a copy-cons and assignment operator  ?

            //使用scpp::vector提供更安全的下标访问实现,它可以捕捉越界访问错误
             T& operator[] (size_type index) {
                 SCPP_ASSERT( index < std::vector<T>::size() ,
                     "Index " << index << " must be less than " << std::vector<T>::size());
                 return std::vector<T>::operator[](index);
             }

             //? difference 
             const T& operator[] (size_type index) const {
                 SCPP_ASSERT( index < std::vector<T>::size() ,
                     "Index " << index << " must be less than " << std::vector<T>::size());
                 return std::vector<T>::operator[](index);
             }

             //允许此函数访问这个类的私有数据
             //friend std::ostream& operator<< (std::ostream& os,const ) ?
            };
} //namespace

template<typename T>
inline  std::ostream& operator<< (std::ostream& os,const scpp::vector<T>& v) {
    for(unsigned i=0 ;i<v.size();i++) {
            os << v[i];
            if( i+1 < v.size()) os << " ";
    }
    return os;
}


#endif

//test_vector.cpp
#include "scpp_vector.h"
#include <iOStream>

using namespace std;
int main() {
    //usage-创建一个具有指定数量的vector:scpp::vector<int> v(n); 把n个vector元素都初始化为一个值:scpp::vector<int> v(n,val)
    //方法3:scpp::vector<int> v; v.reserve(n),表示开始的vector是空的,对应的size()为0,
    //并且开始添加元素时,在长度达到n之前,不会出现导致速度降低的容量增长现象
    scpp::vector<int> vec;
    for(int i=0;i< 3;i++){
        vec.push_back(4*i);
    }
    cout << "The vector is : "<< vec <<endl;

    for(int i=0;i <= vec.size();i++) {
        cout << "Value of vector at index " << i << " is " << vec[i] << endl;
    }
    return 0;
}

  我们直接使用scpp::vector而尽量不与std::vector交叉使用。

2.静态数组

  静态数组是在栈上分配内存,而vector模板是在构造函数中用new操作符分配内存的,速度相对慢些,为保证运行时效率,建议使用array模板(同样也是栈内存),实现代码和测试如下:


//scpp_array.h
#ifndef _SCPP_ARRAY_H_  
#define _SCPP_ARRAY_H_

#include "scpp_assert.h"

namespace scpp {

//wrapper around std::vector,在[]提供了临时的安全检查
//fixed-size array
template<typename T,unsigned int N>
class array {
    public:
         typedef unsigned int size_type;

         //常用的构造函数 commonly use cons
        array() {}
        explicit array(const T& val) {
            for(unsigned int i=0;i < N;i++) {
                     m_data[i]=val;
                 }
        }
                 
        size_type size() const { 
            return N;
        } //must use const if we use the size()
             
        //Note : we don't provide a copy-cons and assignment operator  ?

        T& operator[] (size_type index) {
             SCPP_ASSERT( index < N,
                     "Index " << index << " must be less than " << N);
             return m_data[index];
         }

         //? difference 
        const T& operator[] (size_type index) const {
             SCPP_ASSERT( index < N ,
                     "Index " << index << " must be less than " << N);
             return m_data[index];
        }

         //模拟迭代器的begin和end方法
         //访问方法accessors
        T* begin() { 
            return &m_data[0];
        }

        const T* begin() const { 
            return &m_data[0];
        }

         //返回越过数组尾部的迭代器
        T* end() { 
             return &m_data[N];
        }

        const T* end() const { 
             return &m_data[N];
        }
    private:
        T m_data[N];
    };
} //namespace scpp

template<typename T,unsigned int N>
inline  std::ostream& operator<< (std::ostream& os,const scpp::array<T,N>& v) {
    for(unsigned int i=0 ;i< N;i++) {
            os << v[i];
            if( i+1 < v.size()) os << " ";
    }
    return os;
}
#endif

//test_array.cpp
#include "scpp_array.h"
#include <iostream>
#include <alGorithm> //sort algorithm
using namespace std;
int main() {
    //use vector/array class instead of static array or dynamic array
    scpp::array<int,5u > arr(0); 
    arr[0]=7;
    arr[1]=2;
    arr[2]=3;
    arr[3]=9;
    arr[4]=0;

    cout << "Array before sort : " << arr << endl;
    sort(arr.begin(),arr.end());
    cout << "Array after sort : "<< arr << endl;

    arr[5]=8;
    return 0;
}

到此这篇关于C++索引越界的解决方法的文章就介绍到这了,更多相关C++索引越界内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++索引越界的解决方法

本文链接: https://www.lsjlt.com/news/131791.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++索引越界的解决方法
    目录1. 动态数组2.静态数组避免"索引越界"错误的规则如下(针对C++): 不要使用静态或动态分配的数组,改用array或vector模板 不要使用带方括号的ne...
    99+
    2024-04-02
  • C++中索引越界的解决方法
    这篇文章主要介绍“C++中索引越界的解决方法”,在日常操作中,相信很多人在C++中索引越界的解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中索引越界的解决方法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Python脚本索引越界问题怎么解决
    Python脚本索引越界问题可以通过以下几种方式解决:1. 检查索引范围:在访问索引之前,先检查索引是否越界。可以使用条件语句(例如...
    99+
    2023-08-18
    Python
  • Python切片索引越界的问题(数组下标越界)
    前言 Python语言处理字符串、数组类的问题时有一定概率需要使用切片方法,比如:Leetcode_5。 学习官方解法时发现切片的索引可以超出字符串或数组最大索引值,此时编译器不会...
    99+
    2024-04-02
  • Python脚本索引越界的问题
    在Python中,脚本索引越界的问题通常会导致IndexError异常。索引越界是指尝试访问列表、元组、字符串或其他可迭代对象中不存...
    99+
    2023-08-18
    Python
  • 为什么我的索引越界异常
    出现索引越界异常(IndexOutOfBoundsException)是因为你正在访问数组、列表或字符串的索引超出了其范围的位置。可...
    99+
    2023-09-26
    索引
  • C语言数组越界引发的死循环问题解决
    目录一、引入二、代码缺陷三、为什么会死循环?四、补充说明五、总结一、引入 下面的程序在VS编译器会出现什么问题?运行结果是什么?为什么? #include <stdio.h&g...
    99+
    2022-11-13
    C语言 数组越界
  • C++中常见的数组越界问题解决方案
    C++中常见的数组越界问题解决方案,需要具体代码示例在C++编程中,数组越界是一个常见的错误。当我们在访问数组中的元素时超出了数组的索引范围,就会导致程序出现未定义的行为。为了避免这类错误,我们需要采取一些解决方案。解决方案一:正确使用数组...
    99+
    2023-10-22
    异常处理 (Exception Handling) 边界检查 (Boundary checking) 调试工具 (Deb
  • Mysql索引失效的解决方法
    小编给大家分享一下Mysql索引失效的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景6千万数据量的数据表出现了一个满...
    99+
    2024-04-02
  • PC流量越来越低的解决方法
    这篇文章给大家分享的是有关PC流量越来越低的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  便捷性:  我们所有人都在追求高效、便捷,怎么简单怎么来的生活方式,从私家车的出行,到选择地铁的出行也无一不是...
    99+
    2023-06-10
  • win7电脑越用越卡的解决方法
    这篇文章将为大家详细讲解有关win7电脑越用越卡的解决方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、下载软件时要注意Windows系统的开放性的确方便了用户,用户可以在网上随意下载各种软件并安装,...
    99+
    2023-06-28
  • C#中索引超出了数组界限如何解决
    索引超出了数组界限是指访问了数组中不存在的元素,这种情况会导致程序抛出 IndexOutOfRangeException 异常。为了...
    99+
    2023-09-12
    C#
  • SQL Server索引超出了数组界限的解决方案
    有开发的同事反映远程登录SQL Server操作报错,索引超出了数组界限等 如下图 线上数据库版本为SQL Server2012 R2,检查后发现开发人员SSMS版本为2008...
    99+
    2024-04-02
  • 索引失效的情况和解决方法
    1. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描 SELECT * FROM user WHERE name LIKE '%用%'​-- 优化方式:尽量在字段后面使用模糊查询SELECT * F...
    99+
    2023-09-16
    数据库 mysql java
  • 安装Win10后C盘空间不足越来越少的两个解决方法
      使用电脑就得考虑到C盘空间容量,无论是软件还是系统,还是令人烦不胜烦的缓存。装上Win10C盘空间就直接满了,那就想想怎么办,想不出办法就看看本文支出的招数吧。   1. 用系统自带的磁盘管理把D盘搞点过来。D盘先删...
    99+
    2023-06-09
    Win10 C盘空间 越来越少 空间 C 解决
  • CSS中如何解决越界的问题
    这期内容当中小编将会给大家带来有关CSS中如何解决越界的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CSS相关知识(1)如何解决父元素的第一个子元素的margin-...
    99+
    2024-04-02
  • C#索引器的用法
    这篇文章主要介绍“C#索引器的用法”,在日常操作中,相信很多人在C#索引器的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#索引器的用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!简单说来,所谓C...
    99+
    2023-06-18
  • mysql的索引类型和索引方法
    mysql 索引类型包括普通索引、唯一索引、全文索引、空间索引和哈希索引。索引方法有 btree、hash 和 rtree。选择合适的索引类型和方法取决于数据类型和查询模式,例如范围查找...
    99+
    2024-04-22
    mysql
  • matlab索引超出数组边界如何解决
    当索引超出数组边界时,可以采取以下几种方式解决:1. 检查数组的尺寸和索引的范围是否匹配。确保索引在数组的有效范围内。2. 使用条件...
    99+
    2023-09-15
    matlab
  • Oracle Index索引无效的原因与解决方法
    索引无效原因 最近遇到一个Oracle SQL语句的性能问题,修改功能之前的运行时间平均为0.3s,可是添加新功能后,时间达到了4~5s。虽然几张表的数据量都比较大(都在百万级以上),但是也都有正确创建索引...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作