C++编程调试秘笈----读书笔记(3)
三、索引越界1、动态数组可以使用new,也可以用vector来动态创建但是当下标的索引超过size的时候,new出来的数组对其进行更改的时候会有不确定的错误产生;vector提供了一个at(index)的函数,他通过抛出一个out_of_range异常执行边界检测测试代码(vs2012+win7环境):[cpp]#include "stdafx.h"#include "scpp_assert.h"#include "iostream"#include "vector"#define SIZE 10int _tmain(int argc, _TCHAR* argv[]){char *str = new char[SIZE];str[SIZE + 1] = 'x';std::vector<char> arrayStr;arrayStr.resize(SIZE);arrayStr[11] = 'x';return 0;}他的问题在于如果我们想执行这种安全检查,必须在访问数组元素的每个地方都严格地使用at()函数。显然这种做易做图降低代码的效率,因此在完成了测试之后,我们可能想要速度更快的[]操作符在每处对他继续拧替换。但是,这样的替换对代码进行大量的修改。因此可以使用下面的方法(以解决不必使用at函数):[cpp]#ifndef __SCPP_VECTOR_H__#define __SCPP_VECTOR_H__#include "scpp_assert.h"#include "vector"namespace scpp{template <typename T>class vector : public std::vector<T>{public:typedef unsigned size_type;public: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){ }T &operator[] (size_type index){SCPP_TEST_ASSERT(index < std::vector<T>::size(),"Index " << index << " must be less than "<< std::vector<T>::size());return std::vector<T>::operator [](index);}const T &operator[] (size_type index) const{SCPP_TEST_ASSERT(index < std::vector<T>::size(),"Index " << index << " must be less than "<< std::vector<T>::size());return std::vector<T>::operator [](index);}};}; // namespace scpptemplate <typename T>inline std::ostream &operator << (std::ostream &os, const scpp::vector<T>& v){for (unsigned index = 0; index < v.size(); ++index){os << v[index];if (index + 1 < v.size()){os << " ";}}return os;}#endif测试代码(vs2012+win7环境):[cpp]#include "stdafx.h"#include "scpp_assert.h"#include "iostream"#include "scpp_vector.h"#define SIZE 10int _tmain(int argc, _TCHAR* argv[]){scpp::vector<char> str(SIZE, 'z');std::cout << str << std::endl;str[20] = 'x';return 0;}在stdafx.h中打开调试开关:[cpp]#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>// TODO: 在此处引用程序需要的其他头文件/*#define SCPP_THROW_EXCEPTION_ON_BUG*/#define SCPP_TEST_ASSERT_ON2、静态数组:scpp::vector vect(SIZE)他的效果与静态数组完全相同,但问题在于效率。静态数组是在堆栈上分配内存,而vector模板输在构造函数中使用new操作符分配的,速度比较慢,所以这里有array模板:scpp_array.h:[cpp]#ifndef __SCPP_ARRAY_H__#define __SCPP_ARRAY_H__#include "scpp_assert.h"namespace scpp{template <typename T, unsigned N>class array{public:typedef unsigned size_type;public:array(){ }explicit array(const T& initialValue){for (size_type index = 0; index < N; ++index){data_[index] = initialValue;}}size_type size() const { return N; }T& operator[](size_type index){SCPP_TEST_ASSERT(index < N,"Index " << index << " must be less than " << N);&nbs补充:软件开发 , C++ ,
上一个:设置CoreText基本属性
下一个:equal_range用法
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊