簡體   English   中英

C ++清單插入

[英]C++ List Insert

我正在嘗試根據對象數據成員family_id以有序方式將對象插入列表中

創建的第一個對象將跳過此功能,因此在執行此功能之前,列表中將至少有一個名為“ families”的對象。

使用列表插入功能遇到一些麻煩...如何使用此功能在迭代器( itr )之前或之后插入? 我不確定是否要使用某些push_front / push_back方法,但是if / else語句會以這種方式變長。

希望了解有關如何以簡單方式創建此主題的想法。

家庭班

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++
      }
};

如果您要問的是我想問的問題,則insert函數會將值放在給定的位置,並將其他所有內容推回去。 例如:

#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
};

如果您想更快地插入,可以考慮使用二進制搜索 ,但這不會做很多,除非您的列表很大。 除此之外,您的代碼看起來不錯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM