C++ 列表插入

C++ List Insert

我正在尝试根据对象数据成员 family_id

以有序方式将对象插入到列表中

创建的第一个对象会跳过此函数,因此在执行此函数之前,列表中至少会有一个名为 'families' 的对象。

运行 使用 List 插入函数时遇到一些麻烦...如何使用此函数在迭代器 (itr) 之前或之后插入?我不确定是否使用某些 push_front / push_back 方法,但是 if/else 语句可以这样变得很长...

非常感谢有关如何以简单的方式创建它的想法。

家庭Class

class Family
{
private:
   int family_id;

public:
   int get_family_id()
   {
      return family_id;
   }
};

主要

list <Family> families;

void insertFamily(int input_id)
{
   list<Family>::iterator itr;
   for(itr = families.begin(); itr != families.end(); itr++)
   {
      if (input_id < itr->get_familyid())
      {
         Family *fam = new Family(input_id);
         families.insert(itr, *fam);
         // Does this insert the object into the first position of the list,
         // bumping the original to the second position?
      } else
         itr++
      }
};

如果您问的是我认为您在问的问题,插入函数会将值放入给定的位置,并将其他所有内容推回。例如:

#include <list>
#include <iostream>
int main(){
    std::list<int> my_list;
    for(int i = 0; i < 5; i++)
        my_list.push_back(i);
    std::list<int>::iterator itr = my_list.begin();
    ++itr;
    my_list.insert(itr, 5);
    for(itr = my_list.begin(); itr != my_list.end(); ++itr)
        std::cout << *itr << " ";
}

打印 0 5 1 2 3 4

因此,如果您希望它在您停止之前插入,只需按给定的方式调用插入即可;如果您想在停止后插入,请致电 ++itr 然后插入。


编辑:如果我没看错你的代码,你还漏掉了一个 break 语句

Family *fam = new Family(input_id);
families.insert(itr, *fam);
break;
^^^^

这会在您完成后中断 for 循环;没有它,您将继续为索引较低的每个家庭添加具有相同 ID 的新家庭。此外,您不需要 else 语句中的 itr++,因为它已经在您的 for 循环中被调用(除非您希望在不匹配时将其增加两次?)。那么您的代码可能如下所示:

主要

list <Family> families;

void insertFamily(int input_id)
{
list<Family>::iterator itr;
for(itr = families.begin(); itr != families.end(); itr++)
{
   if (input_id < itr->get_familyid())
   {
         Family *fam = new Family(input_id);
         families.insert(itr, *fam);
         break; //Added break line
   } //Removed else
};

如果您想要更快的插入,您可以查看 binary searching,但是除非您有一个非常大的列表,否则这不会有太大作用。除此之外,您的代码看起来不错!