我在这里有点困惑,假设我正在制作一个容器,它可以容纳一些元素并且可以删除这些元素。
我会有一个固定的元素数组。
现在我的问题是分配和解除分配该数组和deallocatisingle元素。
1)分配
Item* data;
Container()
{
data = new Item[size];
}
然后添加我做类似的事情:
add(Item it)
{
data[empty++] = it;
}
现在我的问题是我已经创建了size
Items
allocater<T>
个uninitializedfill()
对象,然后当我进入添加时,我在上面添加了另一个项目,所以这意味着破坏了旧的和新的接管?
我应该在阅读时更好地使用remove(Item it)
{
//index is item index
delete data[index];
//restore contiguity to array
empty--;
}
和delete data[index]
来分配所需的内存而不构建对象。
2)取消分配:
真的出现了所有困惑,删除单个元素我可以使用吗?
Item
即使Item
不是指针,我也可以使用{{1}}吗?如果不是我怎么能做到这一部分呢?!
如果可以的话,如果{{1}}是一个指针,那么当我删除它时它会删除它指向的对象吗?
答案 0 :(得分:0)
data = new Item[size];
这将创建一个大小为length的Items数组,并为它们返回一个poitner。这些项目将在索引0 ..(size-1)中包含。
data[empty++] = it;
假设空是&lt;大小,这会将你的一个项目猛击头部,并使用传递给add()的Item重新对其进行重新处理。如果为空&gt; =大小而不是坏事就会发生。
delete data[index];
这不是合法代码。你想要删除所有(大小)项目,直到你想删除该批次。
答案 1 :(得分:0)
使用
分配固定长度数组时data = new Item[size];
您已在一个连续的内存块中一次性分配了数组的所有size
个元素。您没有在数组中分配单个元素,也无法使用delete data[index]
取消分配单个元素 - 完成后,您只能使用delete[] data
释放整个数组。
如果您预计需要在数组末尾添加和删除元素,建议您改用std::vector。如果您希望在数组中的任何位置添加和删除元素,std::list可能更有意义。
答案 2 :(得分:0)
使用:
std::vector<Item> data(N);
答案 3 :(得分:0)
您必须确定Item
是值还是引用的对象。事实上,分配和释放看起来不连贯:
new Item[size]
实际上会创建大小Item
(开始一起存在),而data[i] = item
会复制item
i
Item
{{1}由data
解决(替换其内部值)。这样你就不会“插入”任何东西。 empty
索引(错误名称......)只定义要替换的内容。
delete data[index]
无效,因为data[index]
不是指针(它本身是Item
)。
与data = new Item[x]
成对的delete[] data
对将所有这些一起删除,因为它们已在一起创建。
在给定预定义大小的项目块中插入和删除项目是...无意义(如果您可以执行大小未预定义)。
您必须考虑重新分配数组,复制和移位元素。但这只不过是重新实施std::vector
。