有人可以帮我做我自己的Vector课程吗?

时间:2017-05-07 14:53:25

标签: c++ class object push-back

我只对push_back函数有问题,编译器说:

  

CRT检测到应用程序在堆缓冲区结束后写入内存

我想创建一个push_back function,为向量的结尾添加一个新元素。

#pragma once
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstdlib>

class tomb {
private:
    double *adat;
    int szam;
public:
    tomb(){
        adat = NULL;
        szam = 0;
    }
    int meret()const {
        return szam;
    }
    ~tomb() {
        delete[] adat;
    }
    double & operator[](int n) {
        return adat[n];
    }
    const double & operator[](int n)const {
        return adat[n];
    }
    void push_back(const double &a) {
        double *tmp;
        int pos = szam + 1;
        tmp = new double[szam+1];

        for (int i = 0; i < szam; i++)
        {
            tmp[i] = adat[i];
        }

        tmp[pos] = a;
        delete[] adat;
        adat = tmp;
        ++szam;
    }
    void Kiir()const {
        for (int i = 0; i < szam; i++)
        {
            std::cout << adat[i] << "\n";
        }
    }
};

2 个答案:

答案 0 :(得分:0)

pos应为szam而不是szam+1。您愿意在最后一个位置插入,该位置在基于0的索引中为n-1

答案 1 :(得分:0)

问题出在这一行:

tmp[pos] = a;

由于pos已初始化为szam + 1,因此相当于:

tmp[szam + 1] = a;

这是数组限制之一。

解决方案是完全摆脱pos并且只做:

tmp[szam] = a;

BTW,您的类正在使用默认的复制构造函数和赋值运算符,这些将无法正常工作。你应该真的为此做些什么。