嗨,我正在尝试做这样的事情:
在第一次迭代时说我有
A={2,3,5}
然后在第二次迭代中它变成
A={2,3}
等等。我尝试在第一次迭代后将第三个元素设为零,但随后算法出错了。
当我们执行每次迭代时,C++ 中删除数组中元素的方法是什么?
嗨,我正在尝试做这样的事情:
在第一次迭代时说我有
A={2,3,5}
然后在第二次迭代中它变成
A={2,3}
等等。我尝试在第一次迭代后将第三个元素设为零,但随后算法出错了。
当我们执行每次迭代时,C++ 中删除数组中元素的方法是什么?
最好的(也是最类似于 C++ 的)方法是从数组切换到可调整大小的容器,例如std::vector
. 这个容器是动态调整大小的,让您可以从容器的末尾或容器中的任何其他位置删除元素。然后容器将调整为正确的大小。
// Create a vector
std::vector<int> mydata(10, -1);
for (int i = 0 ; i != 10 ; i++)
mydata[i] = i;
// Process all elements
for (int i = 0 ; i != mydata.size() ; i++) {
cout << mydata[i] << endl;
}
// Remove the last element
mydata.pop_back();
// Process all elements - now the last one is not there
for (int i = 0 ; i != mydata.size() ; i++) {
cout << mydata[i] << endl;
}
将阵列想象成带有槽的金属结构。插槽不能更改,它们是固定的。
用书填满插槽。这就像将值放入数组中。
从第 3 个插槽中取出第 3 本书。因为它是固定槽的金属结构,所以其他的书都没有调整或移动。他们在他们原来的位置。
要“移除”空槽,请从下一个槽中拉出一本书并将其放入空槽中。重复直到“空”插槽结束或所有剩余的书都已移动。这就是std::vector
删除项目的方式。
链表在删除槽时更有效。把链表想象成一堆容器,一端有一个钩子,另一端是字符串。您只能将绳子系在一个容器的挂钩上。跟随字符串为您提供容器的顺序。要移除一个容器,先解开前一个容器的绳子并将其系在下一个容器的钩子上,然后解开容器的绳子。您不必复制或移动任何剩余元素;你只是移动了字符串。
除非您跟踪删除的容器,否则它可能会丢失。这种情况称为内存泄漏:内存中丢失的项目。
您不能在 C++ 中删除常规数组中的元素。如果您使用的是 List 或 vector 则另当别论,但是对于普通数组,您只能创建新数组,并从旧数组中复制值,而无需“删除”您要“删除”的值。然后说“新数组”是“旧数组”。
对于 C++ 风格:使用 std:vector 并遵循this。
对于 C 风格:使用动态堆数组,即 new/delete/realloc