New和数组大小

New and arrays size

本文关键字:数组 New      更新时间:2023-10-16

我有一个动态创建的整数数组。现在我必须删除索引为%3 == 0的所有元素。(例如,3,6,9,…)。那么,减小数组大小的最佳方法是什么呢?对于malloc,我可以对相同的内存部分使用realloc,但是new操作符呢?怎么做呢?把所有元素都向左滑动,让所有元素都变成0 ?

#include <algorithm>
#include <iostream>
#include <vector>
bool IsDividedByThree (int i) { return ((i%3)==0); }
int RandomNumber () { return (rand()%100); }
int main()
{
    std::vector<int> myInts(50);
    std::generate(myInts.begin(), myInts.end(), RandomNumber);
    std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));
    myInts.erase(std::remove_if(myInts.begin(), myInts.end(), IsDividedByThree), myInts.end());
    std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));
}

STL为你照顾一切不是很好吗?

Hm没有看到注释,其中强制而不是使用STL

C版本:

    int *temp = new int[NEW_SIZE];
    memcpy( temp , old_array, size_of_old_array * sizeof(int) );
    delete[] old_array;
    old_array = temp;
    动态创建数组
  1. 创建一个新的数组与新的大小
  2. 将第一个数组中的元素复制到第二个数组
  3. 删除第一个数组
  4. 将指向第一个数组的指针重定向到第二个数组

所有这些都回答那么,减小数组大小的最佳方法是什么? -我认为你已经知道如何解决剩下的问题了。

我将简单地分配一个新的较小的数组,然后将元素复制到它。像这样(包括索引为0的元素):

int* array = new int [original_size];
// fill array
size_t new_size = original_size - original_size / 3 - 1; // i think i got this right, untested
int* new_array = new int [new_size];
for (int i = 0, int j = 0; i < original_size; i++)
{
    if (i % 3 == 0)
    {
        new_array[j] = array[i];
        j++
    }
}
delete [] array;
array = new_array;
new_array = nullptr;

你当然可以在原地工作,把元素移到左边。但是你不能删除通过new[]分配的数组的一部分

既然这是一个练习,你不能使用STL,为什么你不尝试实现一个简单的向量类自己?

您可以在c++中使用位置new操作符。(需要#include <new>)。例如

#include <new>
int main(int argc, char **argv) {
    double *b = new double[10];
    new(b) double[8];
    delete [] b;
}

简单地将数据元素设置为0不会释放它们。当你为调整大小的数组分配新的内存时,你需要从以前的内存中复制所有的元素。

我建议你把它作为一个链表来实现。