2013-03-15 92 views
1

所以我尝试下编译代码:具有boolinq header我的boolinq .orderBy有什么问题?

#include <math.h> 
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include "boolinq.h" 

float dtSqrt(float x) 
{ 
    return sqrtf(x); 
} 

/// Returns the distance between two points. 
/// @param[in]  v1 A point. [(x, y, z)] 
/// @param[in]  v2 A point. [(x, y, z)] 
/// @return The distance between the two points. 
inline float dtVdist(const float* v1, const float* v2) 
{ 
    const float dx = v2[0] - v1[0]; 
    const float dy = v2[1] - v1[1]; 
    const float dz = v2[2] - v1[2]; 
    return dtSqrt(dx*dx + dy*dy + dz*dz); 
} 

int main() { 
    float target[] = {1,2,3}; 

    float floats1[] = {1.321f,2.123f,3.333f}; 
    float floats2[] = {1.011f,2.234f,3.555f}; 
    float floats3[] = {1.9f,2.9f,3.9f}; 
    float floats4[] = {1,2,3}; 
    float floats5[] = {1,2,3.123f}; 

    std::vector<const float *> floatsVector; 
    floatsVector.push_back(floats1); 
    floatsVector.push_back(floats2); 
    floatsVector.push_back(floats3); 
    floatsVector.push_back(floats4); 
    floatsVector.push_back(floats5); 

    //stl way 
    //std::sort(floatsVector.begin(), floatsVector.end(), [&](const float* pointA, const float* pointB) -> bool{ 
    // auto distA = dtVdist(pointA, target); 
    // auto distB = dtVdist(pointB, target); 
    // return distA < distB; 
    //}); 
    // auto stl_point = floatsVector.front(); 

    try { 
     auto point = boolinq::from(floatsVector) 
      .orderBy([&](const float* point) -> float{ 
       auto dist = dtVdist(point, target); 
       return dist; 
     }) 
      .reverse() 
      .toVector() 
      .front(); 

     std::cout << point[0] << " " << point[1] << " " << point[2] << ";" << std::endl; 

    } catch (std::exception &e) { 
     std::cout << e.what() << std::endl; 
    } 
    std::cin.get(); 
    return 0; 
} 

这PROGRAMM编译相当快。然而,它无法形容在一些内矢量断言错误运行时:

enter image description here

问题是:

boolinq::from(floatsVector) 
       .orderBy([&](const float* point) -> float{ 
        auto dist = dtVdist(point, target); 
        return dist; 
      }).toVector(); 

是空载体。

取消注释stl代码使程序按预期工作!

futher更简单点的重新排序使其按预期工作:

float floats1[] = {1,2,3}; 
float floats2[] = {1,2,3.123f}; 
float floats3[] = {1.321f,2.123f,3.333f}; 
float floats4[] = {1.011f,2.234f,3.555f}; 
float floats5[] = {1.9f,2.9f,3.9f}; 

一个非常奇怪的错误...

BTW下面的代码:

#include <math.h> 
#include <iostream> 
#include <algorithm> 
#include <vector> 
#include "boolinq/boolinq.h" 

struct Point { 
    float X; 
    float Y; 
    float Z; 
    Point() : X(0), Y(0), Z(0) {} 
    Point(float X, float Y, float Z) : X(X), Y(Y), Z(Z) {} 
}; 

float dtSqrt(float x) 
{ 
    return sqrtf(x); 
} 

inline float dtVdist(const float* v1, const float* v2) 
{ 
    const float dx = v2[0] - v1[0]; 
    const float dy = v2[1] - v1[1]; 
    const float dz = v2[2] - v1[2]; 
    return dtSqrt(dx*dx + dy*dy + dz*dz); 
} 

inline float dtVSqrDist(const Point & v1, const Point & v2) 
{ 
    const float dx = v2.X - v1.X; 
    const float dy = v2.Y - v1.Y; 
    const float dz = v2.Z - v1.Z; 
    return dx*dx + dy*dy + dz*dz; 
} 

int main() { 
    auto target = Point(1,2,3); 
    auto pointA = Point(1,-2,3); 
    auto pointB = Point(1,2,3); 

    std::vector<Point> pointsVector; 
    pointsVector.push_back(pointA); 
    pointsVector.push_back(pointB); 

    //stl way 
    std::sort(pointsVector.begin(), pointsVector.end(), 
     [&](const Point & pointA, const Point & pointB) -> bool{ 
      auto distA = dtVSqrDist(pointA, target); 
      auto distB = dtVSqrDist(pointB, target); 
      return distA < distB; 
    }); 
    std::reverse(pointsVector.begin(), pointsVector.end()); 
    auto stl_point = pointsVector.front(); 

    std::cout << "stl point: " << stl_point.X << " " << stl_point.Y << " " << stl_point.Z << ";" << std::endl; 

    //try { 

    auto points = boolinq::from(pointsVector) 
     .orderBy([&](const Point & point) -> float{ 
      auto dist = dtVSqrDist(point, target); 
      return dist; 
    }) 
     .reverse() 
     .toVector(); 

    auto point = points.empty() ? Point() : points.front(); 

    std::cout << "boolinq point: " << point.X << " " << point.Y << " " << point.Z << ";" << std::endl; 

    //} catch (std::exception &e) { 
    // std::cout << e.what() << std::endl; 
    //} 
    std::cin.get(); 
    return 0; 
} 

产地:

什么我的代码有问题吗?它看起来相似orderBy例如,在main boolinq page ......上提供?

+0

@NicolBolas与他链接到的图书馆:https://code.google.com/p/boolinq/ – 2013-03-15 00:04:56

+0

btw:在VS2012,VS2012与11月CTP相同的结果.... – myWallJSON 2013-03-17 10:24:36

回答

2

显然boolinq不支持.orderBy()。reverse() - 这有点令人担忧,被授予。如果按负距离排序(不反转),它就可以工作。

对我来说,这看起来像boolinq没有准备好严肃使用。

+0

尚未反向(没有orderBy)作品...它真的很伤心..因为与LINQ使用矢量使用会变得非常简单... – myWallJSON 2013-03-16 20:57:26

+0

认为orderBy不是一个关键功能 - 您可以随时保存到一个临时。矢量和简单的排序。由于这就是幕后发生的事情,所以这不是一个坏主意 - 然后你可以创建一个不同的非booLinq C++范围实现(比如boost范围),这个实现更加健壮,但不会实现order by – 2013-03-21 14:32:44