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)之后失效

为啥在达到容量后在向量中进行插入时,C++ 不处理迭代器?

c++中列表迭代器的无效使用

STL之--插入迭代器(back_inserter,inserter,front_inserter的区别)

为啥 C++ 字符串迭代器不检查错误?

C++:迭代器iterator