C++ 列表插入迭代器
Posted
技术标签:
【中文标题】C++ 列表插入迭代器【英文标题】:C++ List Insert Iterator 【发布时间】:2015-04-29 03:05:30 【问题描述】:family 对象包含一个 Person 对象的链表,因此,Family 类中有一个函数可以将 Person 对象插入到名为 people 的 ListedList 中。
我遇到了一些麻烦,即只有某些 Person 对象被添加到人员链接列表中。我省略了许多其他函数,因为我(希望)能够确定问题发生在 Family 类的 insertPerson()
函数中。
insertPacket()
中的 for 循环按预期循环遍历每个“Person”对象(请参阅注释的“cout”)。然而,事情在 if 语句中被打破了..
if (person_id < itr->get_person_id())
Person *psn = new Person(person_id, name);
people.insert(itr, *psn);
break;
如果person_id
小于链表中的get_person_id()
,它会执行并将其插入到链表的开头,但如果不是,则完全跳过它...
【问题讨论】:
仍在阅读您的问题,但您可能应该修复内存泄漏,其中至少有三个。而且我看不到从createPerson
调用的insertPacket
的实现。我只看到insertPerson
。
我不完全确定你在问什么。您是说如果person_id
小于它添加的list
中的任何人的ID,并且如果ID 不小于它“完全跳过它”。这似乎是您的代码正在做的事情,但您想让它做什么?
insertPacket 的实现——我使用头文件来声明每个函数,为了简化,这里没有展示。你指的是这个吗?内存泄漏 - 如果您能指出我正确的方向,会很感激吗?目的是根据 person_id 以升序将人员对象插入到列表中。
不要简化代码是不可编译的,不能重现你的问题。 MCVE 的重点是重现您当前代码的不良行为,而需要最少量的代码来修复它。为此,除非问题非常明显,否则我们需要足够的代码来剪切、粘贴、编译和运行(最好是针对重现问题的数据样本)。当前的帖子不是 MCVE。关于您的内存泄漏,我在这段代码中没有看到需要new
。
@WhozCraig 谢谢让我跟上进度。我已经更新了代码以包含所有内容以及一些初始数据。我已将对象创建更改为自动内存。如果运行,您应该看到只有两个人被插入到家庭中,而不是预期的三个人..
【参考方案1】:
你的基本错误在这里,在insertPerson
:
for(itr = people.begin(); itr != people.end(); itr++)
if (id < itr->get_person_id())
people.insert(itr, Person(id, text));
break;
如果此人的 id 大于 所有 当前列表成员怎么办?然后insert
将永远不会发生,因为您将到达end()
并打破循环。这应该用于查找插入点,可以包括 end()
。
你可以这样做找到合适的插入点:
for(itr = people.begin(); itr != people.end(); itr++)
if (itr->get_person_id() < id)
break;
people.insert(itr, Person(id, text));
请注意,这将允许对给定 ID 进行重复插入。不确定你是否在乎。最后,插入Family
也存在同样的问题,因此您可能希望在此之后解决该问题。
祝你好运。
【讨论】:
【参考方案2】:试试
if (input_id < itr->get_familyid())
Family *fam = new Family(input_id);
families.insert(itr, *fam);
break;
std::list 根据this链接插入
iterator insert (iterator position, const value_type& val);
【讨论】:
我强烈建议修复内存泄漏。以上是关于C++ 列表插入迭代器的主要内容,如果未能解决你的问题,请参考以下文章
C++ 迭代器 删除(erase)插入(insert)之后失效