我的任务是为SimpleVector创建push_back和pop_back函数,这些函数基本上必须执行您想像的操作。我正在尝试以这种方式将元素添加到现有数组中,但是它不起作用。它加0而不是我在main中传递的数字。有什么想法吗?


  SimpleVector.h


// SimpleVector class template
#ifndef SIMPLEVECTOR_H
#define SIMPLEVECTOR_H
#include <iostream>
#include <new>       // Needed for bad_alloc exception
#include <cstdlib>   // Needed for the exit function

using namespace std;

template<class T>
class SimpleVector
{
private:
    T *aptr;          // To point to the allocated array
    int arraySize;    // Number of elements in the array
    void memError();  // Handles memory allocation errors
    void subError();  // Handles subscripts out of range

public:
    // Default constructor
    SimpleVector()
    {
        aptr = 0;
        arraySize = 0;
    }

    // Constructor declaration
    SimpleVector(int);

    // Copy constructor declaration
    SimpleVector(const SimpleVector &);

    // Destructor declaration
    ~SimpleVector();

    // Accessor to return the array size
    int size() const
    {
        return arraySize;
    }

    // Accessor to return a specific element
    T getElementAt(int position);

    // Overloaded [] operator declaration
    T &operator[](const int &);

    void push_back(SimpleVector, int);

    void pop_back(SimpleVector, int);
};

//***********************************************************
// Constructor for SimpleVector class. Sets the size of the *
// array and allocates memory for it.                       *
//***********************************************************

template<class T>
SimpleVector<T>::SimpleVector(int s)
{
    arraySize = s;
    // Allocate memory for the array.
    try
    {
        aptr = new T[s];
    }
    catch (bad_alloc)
    {
        memError();
    }

    // Initialize the array.
    for (int count = 0; count < arraySize; count++)
        *(aptr + count) = 0;
}

//*******************************************
// Copy Constructor for SimpleVector class. *
//*******************************************

template<class T>
SimpleVector<T>::SimpleVector(const SimpleVector &obj)
{
    // Copy the array size.
    arraySize = obj.arraySize;

    // Allocate memory for the array.
    aptr = new T[arraySize];
    if (aptr == 0)
        memError();

    // Copy the elements of obj's array.
    for (int count = 0; count < arraySize; count++)
        *(aptr + count) = *(obj.aptr + count);
}

//**************************************
// Destructor for SimpleVector class.  *
//**************************************

template<class T>
SimpleVector<T>::~SimpleVector()
{
    if (arraySize > 0)
        delete[] aptr;
}

//*******************************************************
// memError function. Displays an error message and     *
// terminates the program when memory allocation fails. *
//*******************************************************

template<class T>
void SimpleVector<T>::memError()
{
    cout << "ERROR:Cannot allocate memory.\n";
    exit(EXIT_FAILURE);
}

//***********************************************************
// subError function. Displays an error message and         *
// terminates the program when a subscript is out of range. *
//***********************************************************

template<class T>
void SimpleVector<T>::subError()
{
    cout << "ERROR: Subscript out of range.\n";
    exit(EXIT_FAILURE);
}

//*******************************************************
// getElementAt function. The argument is a subscript.  *
// This function returns the value stored at the sub-   *
// script in the array.                                  *
//*******************************************************

template<class T>
T SimpleVector<T>::getElementAt(int sub)
{
    if (sub < 0 || sub >= arraySize)
        subError();
    return aptr[sub];
}

//*******************************************************
// Overloaded [] operator. The argument is a subscript. *
// This function returns a reference to the element     *
// in the array indexed by the subscript.               *
//*******************************************************

template<class T>
T &SimpleVector<T>::operator[](const int &sub)
{
    if (sub < 0 || sub >= arraySize)
        subError();
    return aptr[sub];
}
#endif

template<class T>
void SimpleVector<T>::push_back(SimpleVector obj, int newval)
{
    arraySize = obj.arraySize + 1;

    // Allocate memory for the array.
    aptr = new T[arraySize];
    if (aptr == 0)
        memError();

    // Copy the elements of obj's array.
    for (int count = 0; count < (arraySize - 1); count++)
        *(aptr + count) = *(obj.aptr + count);

    obj.aptr[(arraySize)] = newval;

}



  main.cpp


// This program demonstrates the SimpleVector template.
#include <iostream>
#include "SimpleVector.h"
using namespace std;

int main()
{
    const int SIZE = 10; // Number of elements
    int amtToPrnt = 10;
    int count; // Loop counter

// Create a SimpleVector of ints.
    SimpleVector<int> intTable(SIZE);

// Store values in the two SimpleVectors.
    for (count = 0; count < SIZE; count++)
    {
        intTable[count] = (count * 2);
    }

// Display the values in the SimpleVectors.
    cout << "These values are in intTable:\n";
    for (count = 0; count < amtToPrnt; count++)
        cout << intTable[count] << " ";
    cout << endl;

    intTable.push_back(intTable, 20);
    cout << "These values are in intTable after adding one more value:\n";
    for (count = 0; count < ++amtToPrnt; count++)
        cout << intTable[count] << " ";
    cout << endl;

    /*
     intTable.push_back(intTable, 22);
     cout << "These values are in intTable after adding one more value:\n";
     for (count = 0; count < ++amtToPrnt; count++)
     cout << intTable[count] << " ";
     cout << endl;

     intTable.push_back(intTable, 24);
     cout << "These values are in intTable after adding one more value:\n";
     for (count = 0; count < ++amtToPrnt; count++)
     cout << intTable[count] << " ";
     cout << endl;
     */
    return 0;
}

最佳答案

SimpleVector.h


void push_back(int);


我删除了SimpleVector以减少内存使用。

template <class T>
void SimpleVector<T>::push_back(int newval){
   // Allocate memory for the array in the temporary array.
   T * tmpArray = new T [arraySize + 1];

   // Copy the elements of old array.
   for(int count = 0; count < arraySize; count++)
      *(tmpArray + count) = *(aptr + count);

   // Push new value
   *(tmpArray + arraySize) = newval;

   // Delete old array
   delete[] aptr;

   // Copy array
   aptr = tmpArray;

   // Increase size
   arraySize++;
}



  main.cpp


intTable.push_back(20);
amtToPrnt++;

cout << "These values are in intTable after adding one more value:\n";
for (count = 0; count < amtToPrnt; count++)
    cout << intTable[count] << " ";
cout << endl;


结果:

c&#43;&#43; - 为数组创建“push_back”函数-LMLPHP

边注:
您应该重构您的SimpleVector。如果不需要,请不要使用按值传递。我建议将arraySize公开,以了解您的vector中有多少数据。

09-27 05:59