在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有关。我不知道如何从动态分配的数组中删除该对象
当然,这不是全部代码,但我只选择了相关部分。如果我忘了包括一些东西,请告诉我因为这是一个C,而不是C++程序,所以你可以使用一个链表,这样你就可以删除一个动态分配的数组中的元素。
可能有兴趣因为这是一个C,而不是C++程序,所以你可以使用一个链表,这样你就可以删除一个动态分配的数组中的元素。
可能有兴趣 > 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++。刚开始的时候会让人很困惑,所以坚持使用其中的一种,直到你觉得学习一门新语言很舒服为止。祝你好运