Получить ошибку, используя std :: upper_bound для вектора библиотеки Eigen - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать 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    

1 Ответ

0 голосов
/ 14 февраля 2019

До версии 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;
    // ...
}
...