使用C++寫一個類似NSArray的數(shù)組, 歡迎指正.
```
hpp
#ifndef home_int_array_hpp
#define home_int_array_hpp
#include <iostream>
#include <string.h>
using namespace std;
class IntArray {
? ? friend ostream & operator<< (ostream &os, IntArray const &array);
public:
? ? IntArray();
? ? IntArray(int size);
? ? ~IntArray();
? ? void addObject(int obj);
? ? void insertObject(int idx, int obj);
? ? int objectAtIndex(unsigned int index);
? ? int & operator[] (int idx);
? ? bool operator== (IntArray const &other);
? ? bool operator!= (IntArray const &other);
private:
? ? int _index;
? ? int *_space;
protected:
? ? int init_vessel(int size);
? ? int _size;
};
extern ostream & operator<< (ostream &os, IntArray const &array);
#endif /* home_int_array_hpp */
cpp
#include "home_int_array.hpp"
IntArray::IntArray() {
? ? _index = 0;
? ? _size = 0;
? ? this->_space = NULL;
}
IntArray::IntArray(int size): _size(size) {
? ? _index = 0;
? ? _space = NULL;
? ? init_vessel(size);
}
IntArray::~IntArray() {
? ? if (NULL != _space) {
? ? ? ? delete _space;
? ? ? ? _space = NULL;
? ? }
? ? _index = 0;
? ? _size = 0;
}
void IntArray::addObject(int obj) {
? ? if (_space == NULL) {
? ? ? ? init_vessel(_size==0?1:_size);
? ? }
? ? if (_size < (_index + 1)) {
? ? ? ? init_vessel(_size * 2);
? ? }
? ? _space[_index] = obj;
? ? _index++;
}
void IntArray::insertObject(int idx, int obj) {
? ? if (idx > _index) {
? ? ? ? cout << "越界" << endl;
? ? ? ? return;
? ? }
? ? if (_space == NULL) {
? ? ? ? init_vessel(_size==0?1:_size);
? ? }
? ? if (_size < (_index + 1)) {
? ? ? ? init_vessel(_size * 2);
? ? }
? ? int *tmp = _space + idx;
? ? memcpy(_space + idx + 1, tmp, sizeof(int) * (_index - idx));
? ? _space[idx] = obj;
? ? _index++;
}
int IntArray::objectAtIndex(unsigned int index) {
? ? if (_space == NULL) {
? ? ? ? return 0;
? ? }
? ? if (index > _index) {
? ? ? ? cout << "越界" << endl;
? ? ? ? return 0;
? ? }
? ? return *(_space + index);
}
int IntArray::init_vessel(int size) {
? ? _size = size;
? ? if (_size > 0) {
? ? ? ? if (_space != NULL) {
? ? ? ? ? ? int *tmp = new int[_size];
? ? ? ? ? ? memset(tmp, 0, sizeof(int) * _size);
? ? ? ? ? ? memcpy(tmp, _space, (_index + 1) * sizeof(int));
? ? ? ? ? ? delete _space;
? ? ? ? ? ? _space = NULL;
? ? ? ? ? ? _space = tmp;
? ? ? ? } else {
? ? ? ? ? ? this->_space = new int[_size];
? ? ? ? ? ? memset(this->_space, 0, sizeof(int) * _size);
? ? ? ? }
? ? }
? ? return 0;
}
ostream & operator<< (ostream &os, IntArray const &array) {
? ? int i = 0;
? ? os << "長度(" << array._size << ") : ";
? ? for (i = 0; i < array._index; i++) {
? ? ? ? os << array._space[i] << ", ";
? ? }
? ? return os;
}
int & IntArray::operator[] (int idx) {
? ? cout << idx << endl;
? ? return *(_space + idx);
}
bool IntArray::operator== (IntArray const &other) {
? ? if (other._index != this->_index) {
? ? ? ? return false;
? ? }
? ? int i = 0;
? ? for (i = 0; i < _index; i++) {
? ? ? ? if (*(this->_space + i) != *(other._space + i)) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? }
? ? return true;
}
bool IntArray::operator!= (IntArray const &other) {
? ? if (other._index != this->_index) {
? ? ? ? return true;
? ? }
? ? int i = 0;
? ? for (i = 0; i < _index; i++) {
? ? ? ? if (*(this->_space + i) != *(other._space + i)) {
? ? ? ? ? ? return true;
? ? ? ? }
? ? }
? ? return false;
}
```