Search code examples
c++oopdynamic-arrays

array class member, with dynamically changeable length during runtime


I am trying to make a network application. Its class blueprint is roughly like this-

class Node
{
    public:
    // member functions
    private:
    int nodeID;
    // other members
};

class NodeNetwork
{
    public:
    // member functions
    private:
    Node nodeArray[MAX_NODES];
    // other members
};

Here, the Node class will deal with each node and the NodeNetwork is used to deal with the complete network.

The actual number of nodes in nodeArray can vary from 0 to MAX_NODES during runtime, i.e., it may not always be MAX_NODES, the number of nodes can be increased or decreased during runtime. Moreover, when the program starts the number will always be 0, after that it will start increasing.

I am using Node nodeArray[MAX_NODES];, but I think it's a serious wastage of space as not always I will have MAX_NODES nodes at runtime. So I am looking for ways to optimize it. I want it so that it starts with a zero-length array, but the size can be increased or decreased subjected to the above constraints based on the nodes added or removed at runtime. I researched on the internet but did not find any concrete answer.

I hope someone can help me solve this problem, thanks in advance.


Solution

  • You can use dynamically array allocation for this purpose:

    int* arr = new int[5];
    

    ..and anytime you wish to change the number of elements:

    int size = 5;
    int* arr = new int[size] {};
    
    int* new_arr = new int[size + 1];
    for (int i = 0; i < size; i++)
    {
        new_arr[i] = arr[i];
    }
    delete[] arr;
    arr = new_arr;
    
    // Now arr has a storage capacity of 6 elements
    

    ..so for your case you can write:

    Node* nodeArray = nullptr; // nullptr == null pointer
    

    But this can take a lot of time for huge arrays.

    So preferably, you can use std::vector:

    #include <iostream>
    #include <vector>
    
    int main() 
    {
        std::vector<int> vec{ 1, 2, 3, 4, 5 };
        vec.push_back(6); //Insert a new element
    
        std::cout << vec[0]; // Accessing an element is the same as an array
    }
    

    ..so for your case:

    // {} is just for initialization, not exactly mandatory
    std::vector<Node> nodeArray{};