使动态数组更大

时间:2015-01-27 05:26:36

标签: c++ arrays dynamic primes

这是针对非分级挑战问题,我希望尽可能快地找到尽可能多的素数。其中一个限制是我必须使用new / delete,因此std::vector不是一个选项。在这个问题中,我需要添加一个包含素数的数组(在我的例子中是一个动态创建的数组,名为list)。我的目标是实现与向量类似的功能,其中如果当前阵列中没有足够的空间,并且当前阵列填满具有2倍长度的新阵列,则仅需要分配新存储器。我在列表中添加素数的功能在

之下
void PrimeList::addPrimeToList(int newPrime) {
    if( sizeof(list)/sizeof(int) > total ) { // there is still room in the array
        list[total++] = newPrime;
    } else { // list has run out of space to  put values into
        int *newList = new int [total*2]; // new list to hold all previous primes and new prime
        for(int i=0; i < total; i++) { // for every old prime
            newList[i] = list[i]; // add that old prime to the new list
        }
        newList[total++] = newPrime; // set largest and the last index of the new list to the new prime
        delete [] list; // get rid of the old list
        list = newList; // point the private data member list to the newly created list.
    }
}

注意:total是一个私有数据成员,它保存到目前为止找到的素数。

我的问题是,每次调用函数时都会发生else语句(以及耗时的分配/释放)(前两个调用总是运行if的第一部分)。我认为if部分会在绝大部分时间运行 - 只要列表仍有空间 - 那么为什么不呢?

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是您用于数组大小的表达式,即

sizeof(list)/sizeof(int)

是一个常量表达式。它的值不依赖于list指针所指向的已分配数组。

您需要单独存储分配的大小以使此代码有效:

if( allocatedSize > total ) { // there is still room in the array
    list[total++] = newPrime;
} else { // list has run out of space to  put values into
    int *newList = new int [total*2]; // new list to hold all previous primes and new prime
    allocatedSize *= 2;
    for(int i=0; i < total; i++) { // for every old prime
        newList[i] = list[i]; // add that old prime to the new list
    }
    newList[total++] = newPrime; // set largest and the last index of the new list to the new prime
    delete [] list; // get rid of the old list
    list = newList; // point the private data member list to the newly created list.
}