c++ - 在 Eigen 库向量上使用 std::upper_bound 得到错误
问题描述
我正在尝试将 std::upper_bound 与 Eigen 库定义的向量一起使用。我在 Visual Studio 2017 上遇到一些错误
#include <stdafx.h>
#include <stdio.h>
#include <Eigen/Dense>
#include <algorithm>
using namespace Eigen;
using namespace std;
int main(int argc, char* argv[])
{
VectorXd myVector= VectorXd::LinSpaced(20, -1.5, 6.4);
double trashold= strtod(argv[1], NULL);
double firstGreaterValue= std::upper_bound(myVector(0),
myVector(myVector.size()-1),trashold);
}
我希望程序返回大于我输入的第一个元素的位置(在本例中为 1.1)。
我在编译时收到这些错误
Severity Code Description Project File Line Suppression State
Error C2794 'difference_type': is not a member of any direct or indirect base class of 'std::iterator_traits<_FwdIt>' errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2347
Error C2938 '_Iter_diff_t<double>' : Failed to specialize alias template errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2347
Error C2672 'std::distance': no matching overloaded function found errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2347
Error C2893 Failed to specialize function template 'iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)' errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2347
Error C2794 'difference_type': is not a member of any direct or indirect base class of 'std::iterator_traits<_FwdIt>' errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2351
Error C2938 '_Iter_diff_t<double>' : Failed to specialize alias template errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2351
Error C2672 'std::advance': no matching overloaded function found errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2353
Error C2893 Failed to specialize function template 'void std::advance(_InIt &,_Diff)' errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2353
Error C2100 illegal indirection errorExample C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\algorithm 2355
解决方案
在 3.4 版之前,Eigen::VectorXd
它与 STL 算法不兼容,因为它不提供迭代器来访问其元素。
从 3.4 版本开始,Eigen
的稠密矩阵和数组提供了兼容 STL 的迭代器,那么你可以使用begin()
/end()
方法来获取迭代器:
auto firstGreaterValueIter = std::upper_bound(myVector.begin(), myVector.end(), trashold);
也不要忘记std::upper_bound
返回一个迭代器,因此您必须取消引用才能获取该值:
if (firstGreaterValueIter != myVector.end()) {
double firstGreaterValue = *firstGreaterValueIter;
// ...
}
推荐阅读
- mysql - 用order by和group by查询sql慢
- python - 使用 Python 和 pandas 解析正确的日期时间
- ubuntu - 在谷歌云平台上连接 ssh 时出错
- python - Python OSError 无法打开资源
- flutter - SwitchListTile 无法对标题和副标题的文本进行样式设置
- sql - 在类型为 number 的列上使用 case 表达式将其输出为字符串
- python - TensorFlow回归模型保存为RESTful格式,调用时报错?
- reactjs - Single SPA 中的 Material UI 主题冲突
- c# - 如何在服务器(.Net)中处理 SignalR 客户端异常?
- reactjs - 如何在反应js的数据表列上方的下拉列表中显示所有不同的值