[英]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.