无法分配给 C++ 中的指针数组

Posted

技术标签:

【中文标题】无法分配给 C++ 中的指针数组【英文标题】:cannot assign to array of pointers in c++ 【发布时间】: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&lt;Movie&gt; 将在程序结束时调用所有 Movie 析构函数。 不管怎样,set 要求它的成员是不变的,以保证一旦插入它以后就不必更改顺序。编译器告诉你,因为&amp;(*id)const Movie*,所以你不能将它分配给Movie*。如果你绝对坚持这样做——很明显,你不应该这样做,因为这似乎是为了让你尝试双重删除东西而存在的大量努力和混乱——你可以改变Movie *pointers[100][100];const Movie *pointers[100][100]; 【参考方案1】:
pointers[(*id).movieId][(*id).shopId] = &(*id);

尝试在pointers 中存储指向Movie 的指针,指向setMovie

现在考虑在您执行此操作后会发生什么。如果你这样做了:

pointers[42][43]->priceId = 44;

这可能会使布景无效(您可能有两次相同的电影)。这就是为什么set 不允许你这样做。

一种方法是:

const Movie *pointers[100][100];

然后,您可以存储指针,因为在法律上不允许您修改电影并弄乱排序。我不确定这是否是一个好主意,但它会解决您当前的问题。

对于 2,不,在指向存储在集合中的电影的指针上调用 delete 不是一个好主意。你没有在这个对象上调用 new,所以你不应该删除它。如果你尝试,你会立即崩溃,或者更晚。

【讨论】:

谢谢,但让我解释一下。通过添加 const 解决了问题。但是现场有擦除功能。所以我们可以删除一个项目。也许我需要使用 Heap,priority_queue。但我需要删除一个项目并可能再次添加它。所以我不想每次都迭代来找到它并删除它。这是我的主要技巧和想法。如果它以编程方式工作,那对我来说就足够了。但是我必须再次删除电影(0,10)并再次添加,多次添加删除。我使用 Set 或任何 LOG(N) 数据结构来执行一些与此问题无关的搜索功能,但我必须这样做。再次感谢 好的,这说明了这一点,但不要使用delete 这个词,除非你的意思是delete。它在 C++ 中具有非常特殊的含义。如果您打算调用 set.erase 并引用要删除的对象,它可能会起作用。仍然没有说这是一个很好的设计,但我并不是说它会崩溃,如果你的意思是 erase 而不是 delete

以上是关于无法分配给 C++ 中的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

[Js-c++]c++中的指针引用和数组名

指向 C++ 中动态分配的二维数组中的一行的指针

将二维指针数组中的字符串分配给一维指针数组

基本 CUDA 指针/数组内存分配和使用

C++结构体指针数组如何分配空间,用new

c ++动态指针数组[重复]