给定的成绩列表
given list of grades
这是我编写的代码,但是显示的内容不正确。请教我需要修复什么。
#include <iostream>
#include <list>
using namespace std;
bool check(int passing){
int g;
if(g<=passing){
return false;
}else{
return true;
}
}
int main()
{
int pg;
cout<<"What is the passing grade?"<<endl;
cin>>pg;
list<int> grades = {100,90,93,95,92,98,97,99,96,94};
grades.remove_if(check);
for(int x : grades){
cout<<x<<'\t';
}
return 0;
}
你在这里:
#include <iostream>
#include <list>
#include <functional>
bool check(int const lhs, int const rhs) {
return lhs < rhs;
}
int main() {
int pg;
std::cout << "What is the passing grade?\n";
std::cin >> pg;
std::list<int> grades{
70, 90, 79, 85, 96, 73, 99, 91, 81, 83,
99, 94, 80, 79, 85, 83, 82, 90, 84, 82,
72, 83, 76, 93, 90, 77, 82, 76, 100, 94
};
grades.remove_if(std::bind(check, std::placeholders::_1, pg));
for (auto const g : grades) {
std::cout << g << '\t';
}
return 0;
}
当询问是否删除调用它的特定元素时,函数检查必须 return 为真。由于 remove_if 需要一元谓词(只能用 1 个参数调用的函数)我使用 std::bind 生成新的可调用对象,当调用时传递参数 std::placeholders::_1 和 pg 来检查 where 而不是 std::placeholders::_1 使用成绩中元素的副本。
让我们用 pg = 90 玩这个。
check(70, 90) -> 70 < 90 吗? -> 是 -> 删除
check(90, 90) -> 90 < 90 吗? -> 否 -> 保留
check(79, 90) -> 79 < 90 吗? -> 是 -> 删除
check(85, 90) -> 85 < 90 吗? -> 是 -> 删除
check(96, 90) -> 96 < 90 吗? -> 否 -> 保留
我想你明白了。
使用 lambda 作为 谓词 用于 remove_if
,如下所示:
#include <iostream>
#include <list>
int main( )
{
std::cout << "What is the passing grade?\n";
int passingGrade { };
std::cin >> passingGrade;
std::list<int> grades { 100, 90, 93, 95, 92, 49, 50, 98, 97, 99, 11, 94 };
/*grades.remove_if( [ &passingGrade ]( const int grade ) // lambda approach
{
return ( grade < passingGrade ) ? true : false;
}
);*/
for ( auto it = grades.begin( ); it != grades.end( ); ) // for-loop approach
{
if ( *it < passingGrade )
{
it = grades.erase( it );
}
else
{
++it;
}
}
for ( const int grade : grades )
{
std::cout << grade << '\t';
}
}
样本I/O
What is the passing grade?
50
100 90 93 95 92 50 98 97 99 94
另一个示例:
What is the passing grade?
95
100 95 98 97 99
这是我编写的代码,但是显示的内容不正确。请教我需要修复什么。
#include <iostream>
#include <list>
using namespace std;
bool check(int passing){
int g;
if(g<=passing){
return false;
}else{
return true;
}
}
int main()
{
int pg;
cout<<"What is the passing grade?"<<endl;
cin>>pg;
list<int> grades = {100,90,93,95,92,98,97,99,96,94};
grades.remove_if(check);
for(int x : grades){
cout<<x<<'\t';
}
return 0;
}
你在这里:
#include <iostream>
#include <list>
#include <functional>
bool check(int const lhs, int const rhs) {
return lhs < rhs;
}
int main() {
int pg;
std::cout << "What is the passing grade?\n";
std::cin >> pg;
std::list<int> grades{
70, 90, 79, 85, 96, 73, 99, 91, 81, 83,
99, 94, 80, 79, 85, 83, 82, 90, 84, 82,
72, 83, 76, 93, 90, 77, 82, 76, 100, 94
};
grades.remove_if(std::bind(check, std::placeholders::_1, pg));
for (auto const g : grades) {
std::cout << g << '\t';
}
return 0;
}
当询问是否删除调用它的特定元素时,函数检查必须 return 为真。由于 remove_if 需要一元谓词(只能用 1 个参数调用的函数)我使用 std::bind 生成新的可调用对象,当调用时传递参数 std::placeholders::_1 和 pg 来检查 where 而不是 std::placeholders::_1 使用成绩中元素的副本。
让我们用 pg = 90 玩这个。
check(70, 90) -> 70 < 90 吗? -> 是 -> 删除
check(90, 90) -> 90 < 90 吗? -> 否 -> 保留
check(79, 90) -> 79 < 90 吗? -> 是 -> 删除
check(85, 90) -> 85 < 90 吗? -> 是 -> 删除
check(96, 90) -> 96 < 90 吗? -> 否 -> 保留
我想你明白了。
使用 lambda 作为 谓词 用于 remove_if
,如下所示:
#include <iostream>
#include <list>
int main( )
{
std::cout << "What is the passing grade?\n";
int passingGrade { };
std::cin >> passingGrade;
std::list<int> grades { 100, 90, 93, 95, 92, 49, 50, 98, 97, 99, 11, 94 };
/*grades.remove_if( [ &passingGrade ]( const int grade ) // lambda approach
{
return ( grade < passingGrade ) ? true : false;
}
);*/
for ( auto it = grades.begin( ); it != grades.end( ); ) // for-loop approach
{
if ( *it < passingGrade )
{
it = grades.erase( it );
}
else
{
++it;
}
}
for ( const int grade : grades )
{
std::cout << grade << '\t';
}
}
样本I/O
What is the passing grade?
50
100 90 93 95 92 50 98 97 99 94
另一个示例:
What is the passing grade?
95
100 95 98 97 99