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,但是除非您有一个非常大的列表,否则这不会有太大作用。除此之外,您的代码看起来不错!
我正在尝试根据对象数据成员 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,但是除非您有一个非常大的列表,否则这不会有太大作用。除此之外,您的代码看起来不错!