如何解决find_if和bind2nd等效于lower_bound,upper_bound
我的任务是从某些代码中删除bind2nd
。
我有一个排序的(升序,可能重复)vector<double> m_x
和一个值为x
的值double
。
是
-
std::vector<double>::const_iterator it = std::find_if(m_x.begin(),m_x.end(),std::bind2nd(std::greater<double>(),x));
-
std::vector<double>::const_iterator it = std::find_if(m_x.begin(),std::bind2nd(std::greater_equal<double>(),x));
-
std::vector<double>::const_iterator it = std::find_if(m_x.rbegin(),m_x.rend(),std::bind2nd(std::less<double>(),x)).base();
-
std::vector<double>::const_iterator it = std::find_if(m_x.rbegin(),std::bind2nd(std::less_equal<double>(),x)).base();
等同于
-
std::vector<double>::const_iterator it = std::upper_bound(m_x.begin(),x);
-
std::vector<double>::const_iterator it = std::lower_bound(m_x.begin(),x);
-
std::vector<double>::const_iterator it = std::upper_bound(m_x.rbegin(),x).base();
-
std::vector<double>::const_iterator it = std::lower_bound(m_x.rbegin(),x).base();
谢谢。
解决方法
是
std::vector<double>::const_iterator it = std::find_if(m_x.begin(),m_x.end(),std::bind2nd(std::greater<double>(),x));
std::vector<double>::const_iterator it = std::find_if(m_x.begin(),std::bind2nd(std::greater_equal<double>(),x));
等同于
std::vector<double>::const_iterator it = std::upper_bound(m_x.begin(),x);
std::vector<double>::const_iterator it = std::lower_bound(m_x.begin(),x);
是的。他们给出的答案相同,只是比较少。
是
std::vector<double>::const_iterator it = std::find_if(m_x.rbegin(),m_x.rend(),std::bind2nd(std::less<double>(),x)).base();
std::vector<double>::const_iterator it = std::find_if(m_x.rbegin(),std::bind2nd(std::less_equal<double>(),x)).base();
等同于
std::vector<double>::const_iterator it = std::upper_bound(m_x.rbegin(),x).base();
std::vector<double>::const_iterator it = std::lower_bound(m_x.rbegin(),x).base();
不。这些具有不确定的行为。您需要给他们相反的比较。
-
std::vector<double>::const_iterator it = std::upper_bound(m_x.rbegin(),x,std::greater<double>{}).base();
-
std::vector<double>::const_iterator it = std::lower_bound(m_x.rbegin(),std::greater<double>{}).base();
import 'package:flutter_layouts/flutter_layouts.dart';
class _FooterScreenState extends State<FooterScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("footer demo"),),body: buildBody(),bottomNavigationBar: BottomNavigationBar(items: [
BottomNavigationBarItem(icon: Icon(Icons.add),title: Text("first")),BottomNavigationBarItem(icon: Icon(Icons.remove),title: Text("second"))
]),);
}
Widget buildBody() {
return Footer(
body: buildContent(),footer: buildFooter(),);
}
Widget buildContent() {
return ListView.builder(
itemBuilder: (c,i) {
return Card(
margin: EdgeInsets.all(16),child: Container(
padding: EdgeInsets.all(24),child: Text("contents"),);
},itemCount: 20,);
}
Widget buildFooter() {
return Container(
padding: EdgeInsets.all(24),decoration: BoxDecoration(color: Theme.of(context).primaryColor),child: FlatButton(
onPressed: () {},child: Text("Lean more",style: Theme.of(context).textTheme.button.copyWith(
color: Theme.of(context).colorScheme.onBackground
),);
}
}
这几乎是1:1的替换。奇怪的是您可以做得更好:
[x](auto&& y) { return std::less_equal<double>{}(y,x); }
这可能更接近编写代码的人的意思,但是如果容器和/或[&](auto&& y) { return y<=x; }
的类型不是x
,则可能会有一些非常细微的差异。
对于您的问题,double
和lower_bound
是根据upper_bound
定义的。 <
的行为不同于<
的{{1}}。
因此,使用!>=
时,您的代码将不会表现出相同的行为。
所以它们不是等效的。
假设我们从考虑中排除了NaN
。
首先要做的是考虑NaN
的情况,因为NaN
比上下界容易思考。
equal_range
是将插入equal_range
的半开间隔的结尾。 upper_bound
是它的开始。
因此,如果x
超出了容器的末尾,则两者都将返回lower_bound
。
如果x
在容器之前,则都返回.end()
。
如果容器中有x
的一个或多个副本,则.begin()
将迭代器返回到x
的第一个实例,而lower_bound
返回第一个迭代器在x
的最后一个实例之后。
如果upper_bound
不在容器中,但在两个元素x
和x
之间,则上限和下限均返回引用a
的迭代器。
现在我们进行比较。
1和2在两种情况下都相同。
3和4不是有效的C ++代码。
所以不,它们不是等效的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。