Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ push_back和insert在我自己的vector类中不能正常工作_C++_Arrays_Templates_Vector - Fatal编程技术网

C++ push_back和insert在我自己的vector类中不能正常工作

C++ push_back和insert在我自己的vector类中不能正常工作,c++,arrays,templates,vector,C++,Arrays,Templates,Vector,这里是头文件,我用一种简单的方式实现了自己的向量类。 问题是,即使代码编译,成员函数pushBack和insert也不能正常工作 如果有人能在我的代码中找出问题,或者找到解决问题的方法,我会非常高兴 #include <iostream> #include <new> using namespace std; template <typename T> class DiyVector { public: DiyVector() {

这里是头文件,我用一种简单的方式实现了自己的向量类。 问题是,即使代码编译,成员函数pushBack和insert也不能正常工作

如果有人能在我的代码中找出问题,或者找到解决问题的方法,我会非常高兴

#include <iostream>
#include <new>
using namespace std;

template <typename T>
class DiyVector
{
  public:
    DiyVector()
    {
        arr = new T[1];
        arrSize = 0;
        index = 0;
        capacity = 1;
    }
    ~DiyVector()
    {
        delete[] arr;
    }

    T& at(unsigned int index) const
    {
        if (index >= arrSize || index < 0)
        {
            throw OutOfRange{};
        }
        else
        {
            return arr[index];
        }
    }

    unsigned int size() const
    {
        return arrSize;
    }

    void pushBack(const T& item)
    {
         if (arrSize == capacity)
         {
            arrTemp = new T[capacity += 1];

            for (unsigned int i = 0; i < capacity; ++i)
            {
                arrTemp[i] = arr[i];
            }

            delete[] arr;
            capacity++;
            arr = arrTemp;
         }

         arr[arrSize] = item;
         arrSize++;

    }

    void popBack()
    {
        if (arrSize == 0)
        {
            throw OutOfRange{};
        }
        else
        {
            arrSize--;
        }
    }

    void erase(unsigned int index)
    {
        if (index >= arrSize || index < 0)
        {
            throw OutOfRange{};
        }

        else
        {
            arrTemp = new T[capacity -= 1];

            for (unsigned int i = 0; i < capacity; ++i)
            {
                arrTemp[i] = arr[i];
            }

            delete[] arr;
            capacity--;
            arr = arrTemp;
        }
    }

    void insert(unsigned int index, const T& item)
    {
        if (index >= arrSize || index < 0)
        {
            throw OutOfRange{};
        }

        else if (index == capacity)
        {
            pushBack(item);
        }
        else if (0 <= index && index <= size())
        {
            arr[index] = item;
        }
    }

    class OutOfRange{};

private:
    unsigned int arrSize;
    unsigned int capacity;
    unsigned int index;
    T* arr;
    T* arrTemp;
  };
#包括
#包括
使用名称空间std;
模板
类DiyVector
{
公众:
DiyVector()
{
arr=新的T[1];
arrSize=0;
指数=0;
容量=1;
}
~DiyVector()
{
删除[]arr;
}
T&at(无符号整数索引)常量
{
如果(索引>=arrSize | |索引<0)
{
抛出范围{};
}
其他的
{
返回arr[索引];
}
}
无符号整数大小()常量
{
返回值大小;
}
无效回推(常数T和项目)
{
如果(arrSize==容量)
{
ARRTTEMP=新T[容量+=1];
for(无符号整数i=0;i=arrSize | |索引<0)
{
抛出范围{};
}
其他的
{
ARRTTEMP=新T[容量-=1];
for(无符号整数i=0;i=arrSize | |索引<0)
{
抛出范围{};
}
else if(索引==容量)
{
推回(项目);
}

else if(0首先检查一些成员函数(例如,包括
插入

对于
arrSize
的subritute
容量

同时删除该语句

capacity++;
arrTemp = new T[capacity += 1];
因为此语句中的容量已增加

capacity++;
arrTemp = new T[capacity += 1];
在函数
insert
中更改此代码段

    else if (index == capacity)
    {
        pushBack(item);
    }
    else if (0 <= index && index <= size())
    {
        arr[index] = item;
    }
因为它没有被使用

请注意,成员函数erase也不正确。至少不需要重新分配阵列并更改其容量。并且容量会减少两倍

     arrTemp = new T[capacity -= 1];
     //...
     capacity--;

也就是说,该函数与函数push-back具有相同的缺陷。在循环中,您处理的是被擦除的元素。

您的意思是
capacity+=1;
而不是
capacity+1;
中的
push-back
?@debrisoroids
capacity+1
不做任何事情,因为您没有给任何东西赋值。因此您必须ve
capacity=capacity+1
或简而言之
capacity+=1
index
从未在构造函数中初始化,因此使用它将成为未定义的行为。显示的代码中有多个基本错误;而且可能还有其他错误,完整的分析将发现。您需要学习如何使用调试器,因此您可以n调试自己的代码并查看它的所有错误。StaskOffFoo.com不是真正的调试器的替代者。这是调试器所需要的。知道如何使用调试器是每个C++开发者所需的技能。您是否使用过这个代码的调试器,如果没有,为什么不?为什么“<代码>(索引>=arrSize | |索引<0)
”几乎在每个方法中都会出现,甚至在这个方法中,它完全没有意义?这看起来像是机器人复制到每个方法中的东西,没有完全理解它的必要性;然后,为了消除编译错误,索引作为类成员被添加;但没有完全理解编译的原因编译错误。当你看到一个你不理解的编译错误时,正确的做法是找出它,而不是在互联网上搜索,并假设第一个解释适用于这里。@Debrisooids好的,这是有意义的(虽然我不喜欢这样的任务,它基本上迫使您实现一个非常糟糕的vector版本)。无论如何,请注意,
索引
不能是
。我要补充一点,这个基于OP代码的解决方案可能会在每次
回推
时增加容量,这将是非常低效的。例如,最好将容量翻一番。@DanielLangr我更新了相对于冗余数据成员索引的post。但是对于insert成员函数,如果(index>=arrSize)@debisoroids但
index
指的是
insert
的参数,而不是
index
成员变量,我抛出的是OutOfRange错误。@debisoroids但在任何情况下,函数擦除中的容量都不能减少两倍。
unsigned int index;
     arrTemp = new T[capacity -= 1];
     //...
     capacity--;