【发布时间】:2021-07-26 03:23:56
【问题描述】:
我需要在 c++ 中保留一个指针数组。我有一个集合来保存我班级的对象。然后我需要遍历集合并将每个项目的指针保留在数组中。顺便说一下,数组是二维的。所以我需要总结的是: 指针[1][4] = PinterToAnItem;原因是我需要稍后删除该项目,所以我想保留指针并直接转到该项目并删除它,而不是再次迭代并找到然后删除。但是我在分配数组时出错。我不知道这个想法将如何运作,但到目前为止它给了我错误。如果不清楚请告诉我
错误是:“CONST类型的值不能分配给电影类型”
struct Movie
{
int movieId;
int shopId;
int priceId;
};
Movie *pointers[100][100];
set<Movie> setMovie;
void main()
{
//reading and initialize the set with movies
// for example movie1 = {0,10,3} so I want to keep in my array a pointer to this object as:
// pointer [0][10] = ObjectPointer
// I have error in loop body. Also (*id), id and &id does not work.
for (auto id = setMovie.begin(); id != setMovie.end(); id++)
pointers[(*id).movieId][(*id).shopId] = &(*id);
}
2-顺便说一句,你们认为这是一个好主意吗?我可以删除指向集合中对象的指针[0][10] 吗?所以通过这种方式,我不需要再次遍历集合并删除(0,10)。我有一个指向 (0,10) 的指针,我将它从集合中删除。 谢谢
已编辑
@Jeffry 的答案是正确的,但它不适用于我删除指定项目的其余问题。我打算保留一个指向项目的指针,然后直接删除它。但我们知道 set.erase(ITERATOR) 或 (actual_value)。所以这里的指针对我不起作用。我必须更改迭代器数组,然后它才能工作。所以我在这里完成,也许以后可以工作。
set<Movie> ::iterator pointers[100][100];
for (auto id = setMovie.begin(); id != setMovie.end(); id++)
pointers[(*id).movieId][(*id).shopId] = id; // I changed here as well
setMovie[1].erase(pointers[1][0]); // works well
// pointers[1][0] is an iterator to an item in set with movieid=1,shopid=0
【问题讨论】:
-
为什么要手动删除
pointers的内容呢?set<Movie>将在程序结束时调用所有Movie析构函数。 -
不管怎样,
set要求它的成员是不变的,以保证一旦插入它以后就不必更改顺序。编译器告诉你,因为&(*id)是const Movie*,所以你不能将它分配给Movie*。如果你绝对坚持这样做——很明显,你不应该这样做,因为这似乎是为了让你尝试双重删除东西而存在的大量努力和混乱——你可以改变Movie *pointers[100][100];到const Movie *pointers[100][100];