C++ 为阵列重新分配内存?
身体C++ 为阵列重新分配内存?,c++,C++,身体 #包括“IntVector.h” #包括 #包括 #包括 使用名称空间std; IntVector::IntVector(){ sz=0; 上限=0; 数据=空; } IntVector::IntVector(无符号大小){ 如果(大小=0){ cap=1; 尺寸=1; 数据=新整数[sz]; for(无符号整数i=0;i上限){ INTA=上限*2; int b=n-上限; 如果(a>b){ 扩大(a); } 否则{ 扩大(b); } } 数据=新整数[sz]; *数据=价值; } in
#包括“IntVector.h”
#包括
#包括
#包括
使用名称空间std;
IntVector::IntVector(){
sz=0;
上限=0;
数据=空;
}
IntVector::IntVector(无符号大小){
如果(大小=0){
cap=1;
尺寸=1;
数据=新整数[sz];
for(无符号整数i=0;i0){
返回false;
}
否则{
返回true;
}
}
常量int&IntVector::at(无符号索引)常量{
如果(指数>sz){
出口(1);
}
否则{
返回数据[索引];
}
}
常量int&IntVector::front()常量{
返回数据[0];
}
常量int&IntVector::back()常量{
返回数据[sz-1];
}
IntVector::~IntVector(){
删除[]数据;
}
void IntVector::expand(){
如果(上限==0){
cap=1;
}
cap=cap*2;
int*数据拷贝=新int[cap];
for(无符号整数i=0;isz | |上限==0){
出口(1);
}
否则{
sz+=1;
如果(sz=上限){
展开();
}
for(无符号整数i=0;i索引){
数据[i-1]=数据[i];
}
}
}
}
void IntVector::erase(无符号索引){
如果(指数>sz | |上限==0){
出口(1);
}
否则{
for(无符号整数i=0;i上限){
展开();
}
数据[sz]=值;
}
void IntVector::pop_back(){
如果(sz<0 | |上限sz){
int a=大小-sz;
for(无符号整数i=a;i上限){
int b=上限*2;
int c=sz-上限;
如果(b>c){
展开();
}
否则{
扩大(c);
}
}
}
void IntVector::reserve(未签名的n){
INTA=上限*2;
int b=n-上限;
如果(a>b){
扩大(a);
}
否则{
扩大(b);
}
}
void IntVector::assign(无符号n,int值){
sz=n;
如果(sz>上限){
INTA=上限*2;
int b=n-上限;
如果(a>b){
扩大(a);
}
否则{
扩大(b);
}
}
数据=新整数[sz];
*数据=价值;
}
int&IntVector::at(无符号索引){
如果(指数>=sz){
出口(1);
}
返回数据[索引];
}
int&IntVector::front(){
返回数据[0];
}
int&IntVector::back(){
返回数据[sz-1];
}
(摘自评论)
读取
*data=*data2
的每一行都应该读取data=data2
。将星号放在前面会取消指针的引用;这不是您想要做的
(对经编辑的问题的答复)
默认构造函数设置data=NULL
。当您尝试删除此指针时,将出现错误。在delete[]data
之前,应始终检查if(data!=NULL)
(另外,另一个构造函数有
*data=0
。这可能是不对的。如果你想把整个事情归零,你可以使用memset
或ZeroMemory
…或for
循环,就像在其他函数中一样。)首先,你实际上有重复的expand()函数。您应该从不提供参数的函数调用1参数展开函数
#include "IntVector.h"
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
IntVector::IntVector(){
sz = 0;
cap = 0;
data = NULL;
}
IntVector::IntVector(unsigned size){
if(size = 0){
cap = 1;
size = 1;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
sz = size;
cap = size;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
IntVector::IntVector(unsigned size, int value){
if(size = 0){
cap = 1;
size = 1;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
sz = size;
cap = size;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = value;
}
}
unsigned IntVector::size() const{
return sz;
}
unsigned IntVector::capacity() const{
return cap;
}
bool IntVector::empty() const{
if(sz > 0){
return false;
}
else{
return true;
}
}
const int &IntVector::at(unsigned index) const{
if(index > sz){
exit(1);
}
else{
return data[index];
}
}
const int &IntVector::front() const{
return data[0];
}
const int &IntVector::back() const{
return data[sz - 1];
}
IntVector::~IntVector(){
delete[] data;
}
void IntVector::expand(){
if(cap == 0){
cap = 1;
}
cap = cap * 2;
int* data_copy = new int[cap];
for (unsigned int i = 0; i < sz; i++){
data_copy[i] = data[i];
}
delete[] data;
data = data_copy;
}
void IntVector::expand(unsigned amount){
if(cap == 0){
cap = 1;
}
cap += amount;
int *data_copy = new int[cap];
for (unsigned int i = 0; i < sz; i++){
data_copy[i] = data[i];
}
//copy(data, data + sz, data_copy);
delete[] data;
data = data_copy;
}
void IntVector::insert(unsigned index, int value){
if(index > sz || cap == 0){
exit(1);
}
else{
sz += 1;
if(sz = cap){
expand();
}
for(unsigned int i = 0; i <= sz; i++){
if(i = index){
data[i] = value;
}
if(i > index){
data[i - 1] = data[i];
}
}
}
}
void IntVector::erase(unsigned index){
if(index > sz || cap == 0){
exit(1);
}
else{
for(unsigned int i = 0; i <= sz; i++){
if(i = index){
data[i] = data[i + 1];
}
}
sz -= 1;
}
}
void IntVector::push_back(int value){
sz += 1;
if(sz > cap){
expand();
}
data[sz] = value;
}
void IntVector::pop_back(){
if(sz < 0 || cap <= 0){
exit(1);
}
sz -= 1;
}
void IntVector::clear(){
sz = 0;
}
void IntVector::resize(unsigned size, int value){
if(size < sz){
sz = size;
}
else if(size > sz){
int a = size - sz;
for (unsigned int i = a; i < size; i++){
data[i] = value;
}
}
if(sz > cap){
int b = cap * 2;
int c = sz - cap;
if(b > c){
expand();
}
else{
expand(c);
}
}
}
void IntVector::reserve(unsigned n){
int a = cap * 2;
int b = n - cap;
if(a > b){
expand(a);
}
else{
expand(b);
}
}
void IntVector::assign(unsigned n, int value){
sz = n;
if(sz > cap){
int a = cap * 2;
int b = n - cap;
if(a > b){
expand(a);
}
else{
expand(b);
}
}
data = new int[sz];
*data = value;
}
int & IntVector::at(unsigned index){
if(index >= sz){
exit(1);
}
return data[index];
}
int & IntVector::front(){
return data[0];
}
int & IntVector::back(){
return data[sz - 1];
}
现在,您将使用带有一个参数的expand()函数
void IntVector::expand()
{
expand(cap * 2);
}
}
这段代码没有本质上的错误(请注意,我刚刚返回,没有调用exit(1))。此外,还将检查容量,以确保您确实需要更改容量
因此,你需要发布你的测试工具,以及你班上的其他人。我们不知道你是如何使用这门课的
现在谈谈这一点:
void IntVector::expand(unsigned amount)
{
if (cap == 0 || sz == 0 || amount == 0)
return;
cap += amount;
int *data2 = new int[cap];
std::copy(data, data + sz, data2);
delete[] data;
data = data2;
如果传递的大小为0,则该代码将失败。是的,从技术上讲,您可以分配大小为0的数组,但您不能像在那一行中那样取消对该内存的引用。你应该检查大小是否为0。你不是已经问过了吗?我对代码做了建议的调整,但是类的测试工具仍然有很多问题。每一行读
*data=*data2
应该读data=data2
。将星号放在前面会解除指针的引用;这不是您想要做的。@Patrick87我将它们分配给data=data2,但是我遇到了很多问题。您在修复代码时会遇到什么错误?建议更新帖子以反映您当前遇到错误的代码。使用修订后的代码编辑了我的原始问题。它仍然给我带来测试工具的问题,因为它一直说存在未定义的行为。该函数的作业说“将IntVector的大小和容量设置为传入参数的值,并动态分配该大小的数组。(不要忘记将数组中的所有值初始化为0)。”编辑:上传我的完整标题和正文。
#ifndef INTVECTOR_H
#define INTVECTOR_H
using namespace std;
class IntVector{
private:
unsigned sz;
unsigned cap;
int *data;
public:
IntVector();
IntVector(unsigned size);
IntVector(unsigned size, int value);
unsigned size() const;
unsigned capacity() const;
bool empty() const;
const int & at (unsigned index) const;
const int & front() const;
const int & back() const;
~IntVector();
void insert(unsigned index, int value);
void erase(unsigned index);
void push_back(int value);
void pop_back();
void clear();
void resize(unsigned size);
void resize(unsigned size, int value);
void reserve(unsigned n);
void assign(unsigned n, int value);
int & at(unsigned index);
int & front();
int & back();
private:
void expand();
void expand(unsigned amount);
};
#endif
#include "IntVector.h"
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
IntVector::IntVector(){
sz = 0;
cap = 0;
data = NULL;
}
IntVector::IntVector(unsigned size){
if(size = 0){
cap = 1;
size = 1;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
sz = size;
cap = size;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
IntVector::IntVector(unsigned size, int value){
if(size = 0){
cap = 1;
size = 1;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = 0;
}
}
sz = size;
cap = size;
data = new int[sz];
for(unsigned int i = 0; i < sz; i++){
data[i] = value;
}
}
unsigned IntVector::size() const{
return sz;
}
unsigned IntVector::capacity() const{
return cap;
}
bool IntVector::empty() const{
if(sz > 0){
return false;
}
else{
return true;
}
}
const int &IntVector::at(unsigned index) const{
if(index > sz){
exit(1);
}
else{
return data[index];
}
}
const int &IntVector::front() const{
return data[0];
}
const int &IntVector::back() const{
return data[sz - 1];
}
IntVector::~IntVector(){
delete[] data;
}
void IntVector::expand(){
if(cap == 0){
cap = 1;
}
cap = cap * 2;
int* data_copy = new int[cap];
for (unsigned int i = 0; i < sz; i++){
data_copy[i] = data[i];
}
delete[] data;
data = data_copy;
}
void IntVector::expand(unsigned amount){
if(cap == 0){
cap = 1;
}
cap += amount;
int *data_copy = new int[cap];
for (unsigned int i = 0; i < sz; i++){
data_copy[i] = data[i];
}
//copy(data, data + sz, data_copy);
delete[] data;
data = data_copy;
}
void IntVector::insert(unsigned index, int value){
if(index > sz || cap == 0){
exit(1);
}
else{
sz += 1;
if(sz = cap){
expand();
}
for(unsigned int i = 0; i <= sz; i++){
if(i = index){
data[i] = value;
}
if(i > index){
data[i - 1] = data[i];
}
}
}
}
void IntVector::erase(unsigned index){
if(index > sz || cap == 0){
exit(1);
}
else{
for(unsigned int i = 0; i <= sz; i++){
if(i = index){
data[i] = data[i + 1];
}
}
sz -= 1;
}
}
void IntVector::push_back(int value){
sz += 1;
if(sz > cap){
expand();
}
data[sz] = value;
}
void IntVector::pop_back(){
if(sz < 0 || cap <= 0){
exit(1);
}
sz -= 1;
}
void IntVector::clear(){
sz = 0;
}
void IntVector::resize(unsigned size, int value){
if(size < sz){
sz = size;
}
else if(size > sz){
int a = size - sz;
for (unsigned int i = a; i < size; i++){
data[i] = value;
}
}
if(sz > cap){
int b = cap * 2;
int c = sz - cap;
if(b > c){
expand();
}
else{
expand(c);
}
}
}
void IntVector::reserve(unsigned n){
int a = cap * 2;
int b = n - cap;
if(a > b){
expand(a);
}
else{
expand(b);
}
}
void IntVector::assign(unsigned n, int value){
sz = n;
if(sz > cap){
int a = cap * 2;
int b = n - cap;
if(a > b){
expand(a);
}
else{
expand(b);
}
}
data = new int[sz];
*data = value;
}
int & IntVector::at(unsigned index){
if(index >= sz){
exit(1);
}
return data[index];
}
int & IntVector::front(){
return data[0];
}
int & IntVector::back(){
return data[sz - 1];
}
void IntVector::expand()
{
expand(cap * 2);
}
void IntVector::expand(unsigned amount)
{
if (cap == 0 || sz == 0 || amount == 0)
return;
cap += amount;
int *data2 = new int[cap];
std::copy(data, data + sz, data2);
delete[] data;
data = data2;
IntVector::IntVector(unsigned size)
{
sz = size;
cap = size;
data = new int[sz];
*data = 0; // what if size is 0?
}