|
|
1
2
您需要了解STL集合之间的区别。 向量是一个连续的(通常)内存块。当您插入中间时,它会尝试重新分配足够的内存来存储现有的数据和新的数据,然后将所有数据复制到正确的位置,并让您像什么都没有发生一样继续工作。然而,正如你所发现的-发生了一些事情。用于引用旧内存块的迭代器仍然指向那里——但数据已被移动。如果你试图使用它们,就会出现内存错误。 一个答案是确定迭代器用于指向何处,并将其更新为指向新位置。通常情况下,人们会使用[]操作符,但您可以使用begin()+x(其中x是向量的索引)。 或者,使用迭代器不会因插入而无效的集合。最好的是清单。列表是由小内存块(每个项目1个)和指向下一个块的指针构成的。这使得插入非常快速和容易,因为不需要修改内存,只需要指向新项两边的块的指针。您的迭代器仍然有效! 擦除是相同的,除非您删除了迭代器引用的项,否则它是无效的(显然),因此您不能对其进行任何操作。即使是++操作符也不会工作,因为内存可能在向量中发生了变化,或者列表指针不同。因此,您可以首先获取下一个元素的迭代器,存储它,然后在删除了一个项后使用它,或者使用erase()方法中的返回值。 |
|
|
2
3
在向量中插入元素会导致与之相关的迭代器无效,因为向量可以增长,从而重新分配其内部存储空间。 |
|
|
3
3
AS
事情就是这样发生的
尝试
它将把外部循环放在测试数据开始的“23”处,并为下一个循环步进到“24”。 |
|
|
4
0
如果您使用list而不是vector作为集合,那么您将不会获得随机访问,它可能会使用更多的内存,但是您将在集合的中间不断插入时间,这样做不会使迭代器失效。 例外情况是您正在擦除的那个,所以在循环结束时您将无法将其++化。您必须通过存储下一个元素的副本来处理这种情况。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |