在C++中从动态分配的数组中删除对象

在C++中从动态分配的数组中删除对象,c++,C++,在第一个阶段中,我创建了一个具有一些属性的天体行星,如名称、类型和与地球的距离。然后我创建了一个存储库,基本上是一个由动态数组元素及其长度和最大容量组成的结构 typedef enum { NEPTUNE_LIKE, GAS_GIANT, TERRESTRIAL, SUPER_EARTH, UNKNOWN }PlanetType; typedef struct { char name[30]; PlanetType type;

在第一个阶段中,我创建了一个具有一些属性的天体行星,如名称、类型和与地球的距离。然后我创建了一个存储库,基本上是一个由动态数组元素及其长度和最大容量组成的结构

typedef enum {
    NEPTUNE_LIKE, 
    GAS_GIANT, 
    TERRESTRIAL, 
    SUPER_EARTH, 
    UNKNOWN
}PlanetType;

typedef struct {
    char name[30];
    PlanetType type;
    float distanceToEarth;
}Planet;

Planet createPlanet(char name[], PlanetType type, double distance) {
    Planet pl;
    strcpy(pl.name, name);
    pl.distanceToEarth = distance;
    pl.type = type;
    return pl;
}

typedef struct
{
    Planet* elems;      /** dynamic array containing the planets */
    int length;         /**  actual length of the array */
    int capacity;       /**  maximum capacity of the array */
} PlanetRepo;

PlanetRepo createPlanetRepo(int capacity) {
    /// create a new planet repo; the elems field must be dynamically allocated (malloc)
    PlanetRepo r;
    r.capacity = capacity;
    r.length = 0;
    r.elems = (Planet*) malloc(sizeof(Planet)*capacity);
    return r;
}

bool remove(PlanetRepo* repo, Planet pl) {
    /// @todo remove planet pl from the repository 
    /// return false if the planet does not exist in the repository
    return false;
}
我的问题与函数remove有关。我不知道如何从动态分配的数组中删除该对象


当然,这不是全部代码,但我只选择了相关部分。如果我忘了包括一些东西,请告诉我可能有兴趣可能有兴趣

> P>因为您坚持标注C++,而不是C:< /P> 在C++中,你根本就不定义平面图和相关函数。相反,您只需声明一个类型为

std::vector<Planet>
而是

struct Planet {
    char name[30];
    PlanetType type;
    float distanceToEarth;
};
您很可能使用std::string而不是char[30]作为名称的类型

与Planet createPlanetchar name[]函数、PlanetType类型、double distance函数不同,您可以为Planet定义一个构造函数:

而且可能会让成员保密


您也不会定义一个未包含范围的枚举,而是一个范围化的,而不是C++(11),参见.< /p> ,因为您坚持标记C++,而不是c:

在C++中,你根本就不定义平面图和相关函数。相反,您只需声明一个类型为

std::vector<Planet>
而是

struct Planet {
    char name[30];
    PlanetType type;
    float distanceToEarth;
};
您很可能使用std::string而不是char[30]作为名称的类型

与Planet createPlanetchar name[]函数、PlanetType类型、double distance函数不同,您可以为Planet定义一个构造函数:

而且可能会让成员保密


你也不会定义一个未被范围化的枚举,而是一个范围化的,而不是C++ 11,参见.P/>< P>,就像前面提到的C++实现了数据结构,这样你就可以很容易地存储你的行星。但你可以做一些类似的事情:

bool remove(PlanetRepo* repo, Planet pl) {
    PlanetRepo* temp = (PlanetRepo*) malloc(sizeof(Planet)*repo->capacity);
    if(!temp){
        return false;
    }
    temp->capacity = repo->capacity;
    temp->size = repo->size-1;
    for(int i = 0; i < repo->size; ++i){
        if(repo[i] != pl){ //This won't work. How to compare Planets is left as an exercise to the reader
            temp[i] = repo[i];
        }
    }
    free(repo);
    repo = temp;
    return true;
}

就像前面提到的C++实现了数据结构,所以你可以很容易地存储你的行星。但你可以做一些类似的事情:

bool remove(PlanetRepo* repo, Planet pl) {
    PlanetRepo* temp = (PlanetRepo*) malloc(sizeof(Planet)*repo->capacity);
    if(!temp){
        return false;
    }
    temp->capacity = repo->capacity;
    temp->size = repo->size-1;
    for(int i = 0; i < repo->size; ++i){
        if(repo[i] != pl){ //This won't work. How to compare Planets is left as an exercise to the reader
            temp[i] = repo[i];
        }
    }
    free(repo);
    repo = temp;
    return true;
}

你确定你不是在写C程序而不是C++程序吗?Maloc、TyBuffFr.Stutt等的使用说明了你正在编写C,而不是C++。@ PulcMcKeZie:你是对的。我同时研究了C和C++,现在我倾向于把它们和C++结合起来,你只需要STD::向量,然后完成。@ SeverienneBianca,这真是个坏主意。两种语言的风格和习语完全不同。你所显示的代码将是一个写得很差的C++程序,而且在C++之前,在技术上甚至会有C++中的未定义行为。你应该关注两种语言之一,你现在正在展示的是如何编写C,而不是C++。这不是C++。这也不是C和C++的混合体。这是C.,你确定你不是在写C程序而不是C++程序吗?Maloc、TyBuffFr.Stutt等的使用说明了你正在编写C,而不是C++。@ PulcMcKeZie:你是对的。我同时研究了C和C++,现在我倾向于把它们和C++结合起来,你只需要STD::向量,然后完成。@ SeverienneBianca,这真是个坏主意。两种语言的风格和习语完全不同。你所显示的代码将是一个写得很差的C++程序,而且在C++之前,在技术上甚至会有C++中的未定义行为。你应该关注两种语言之一,你现在正在展示的是如何编写C,而不是C++。这不是C++。这也不是C和C++的混合体。这是C。非常感谢!我发现我的C++知识实际上有很大的差距,所以我只会坚持C。@ SeffiiNeNBiCANCA注意到C++不是C类,它非常不同,如果你想使用它,你应该花更多的时间学习C++。刚开始的时候会让人很困惑,所以坚持使用其中的一种,直到你觉得学习一门新语言很舒服为止。祝你好运非常感谢你!我发现我的C++知识实际上有很大的差距,所以我只会坚持C。@ SeffiiNeNBiCANCA注意到C++不是C类,它非常不同,如果你想使用它,你应该花更多的时间学习C++。刚开始的时候会让人很困惑,所以坚持使用其中的一种,直到你觉得学习一门新语言很舒服为止。祝你好运