C++ remove_if 覆盖我的向量
我的remove_if似乎正在用过滤掉的元素的值覆盖未过滤掉的元素。这些代码的目的是允许用户过滤并仅显示特定类别的教师。 (不删除任何元素) 这是一些代码
static string compare;
static string debug;
bool filter_Cat (Teacher &t)
{
return (t.getCat() != compare);
}
void filterCat (vector<Teacher> &t)
{
vector<Teacher>::iterator i;
vector<Teacher>::iterator newedited = remove_if(t.begin(), t.end(), filter_Cat);
for (i = t.begin(); i != newedited; ++i)
{
Teacher& te = *i;
te.getName();
cout << "\t";
te.getCategory();
cout << "\t";
te.getLocation();
}
}
void filterTutorCat(vector<Teacher> &t)
{
int choice;
cout << "No\tCategory" << endl
<< "1\tEnglish" << endl
<< "2\tMath" << endl
<< "3\tScience" << endl
<< "Choose the category you wish to filter :";
cin >> choice;
getline(cin, debug);
if(choice <= 3 && choice > 0)
{
if (choice == 1)
{
compare = "English";
filterCat(t);
}
if (choice == 2)
{
compare = "Math";
filterCat(t);
}
if (choice == 3)
{
compare = "Science";
filterCat(t);
}
}
else
{
cout << "Invalid Option" << endl;
}
}
My remove_if seems to be overwriting the elements that are not filtered out with values of filtered out elements. The purpose of these code is to allow user to filter and display only teacher from a certain category. (Not deleting any element)
Here are some of the code
static string compare;
static string debug;
bool filter_Cat (Teacher &t)
{
return (t.getCat() != compare);
}
void filterCat (vector<Teacher> &t)
{
vector<Teacher>::iterator i;
vector<Teacher>::iterator newedited = remove_if(t.begin(), t.end(), filter_Cat);
for (i = t.begin(); i != newedited; ++i)
{
Teacher& te = *i;
te.getName();
cout << "\t";
te.getCategory();
cout << "\t";
te.getLocation();
}
}
void filterTutorCat(vector<Teacher> &t)
{
int choice;
cout << "No\tCategory" << endl
<< "1\tEnglish" << endl
<< "2\tMath" << endl
<< "3\tScience" << endl
<< "Choose the category you wish to filter :";
cin >> choice;
getline(cin, debug);
if(choice <= 3 && choice > 0)
{
if (choice == 1)
{
compare = "English";
filterCat(t);
}
if (choice == 2)
{
compare = "Math";
filterCat(t);
}
if (choice == 3)
{
compare = "Science";
filterCat(t);
}
}
else
{
cout << "Invalid Option" << endl;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
remove_if
将比较函数返回 false 的元素从右向左移动;换句话说,它用比较返回 false 的元素覆盖比较返回 true 的元素。然而,向量的大小不会改变。这内容为,
因此,您想要做的事情应该表达为:
在您的代码中,
getName()
似乎打印了理想情况下不应该执行的名称,而是应该返回名称。所以我建议你更改它以使其返回名称。对getCategory
也执行相同的操作。正确选择你的名字。如果是getName()
,您应该通过返回它来获取您的名字;如果是printName()
,那么它应该打印名称。另外,您编写的代码不好:
const
成员函数。iterator
和const_iterator
之间的区别以及它们的用法。所以我会把你的代码写成:
正如注释中所述:
getCat
、getName
和getCategory
应该是 const 成员函数。事实上,如果getCategory
返回类别,则甚至不需要getCat
。解决了我的问题。
remove_if
shifts elements, for which the compare function returns false, from right to left; which in other words means, it overwrites the elements, for which compare returns true, with elements, for which compare returns false. The size of the vector doesn't change, however.This reads,
So what you want to do should be expressed as:
It seems in your code,
getName()
prints the name which ideally it should not do, instead it should return name. So I would suggest you to change it to make it return name. And do the same forgetCategory
as well. Choose your name correctly. If it isgetName()
, you should get you name by returning it; if it isprintName()
, then it should print name.Also, the code which you've written isn't good:
const
member function.iterator
andconst_iterator
, and their usage.So I would write your code as:
As noted in the comments:
getCat
,getName
andgetCategory
should be const member functions. In fact, ifgetCategory
returns category, thengetCat
isn't even needed.Solved my issue.
remove_if 收集 filter_Cat 在容器开头返回 false 的值。虽然它不会减少容器中的元素数量,但它也不对超出返回范围的元素值做出任何保证。所以使用remove_if时你会丢失值。
remove_if collects the values for which filter_Cat returns false at the start of the container. While it doesn't reduce the number of elements in the container it neither does make any guarantees about the values of the elements beyond the returned range. So you are loosing values when using remove_if.