2013-05-18 2 views
2

컴파일러는 해당 형식에 대한보다 작음 연산자를 알아낼 수 없습니다. 나는 또한 람다와 술어 함수로 시도했다.Eigen :: Vector의 std :: vector에 고유 한 정렬 방법은 무엇입니까?

#include <Eigen/Dense> 
typedef Eigen::Vector3f vec3; 

inline bool operator<(const vec3 &lhs, const vec3 &rhs) { 
    return lhs.x() < rhs.x() && lhs.y() < rhs.y() && lhs.z() < rhs.z(); 
} 

inline bool cmpVecs(const vec3 &lhs, const vec3 &rhs) { 
    return lhs.x() < rhs.x() && lhs.y() < rhs.y() && lhs.z() < rhs.z(); 
} 


inline void removeDuplicates(std::vector<vec3> &con) 
{ 
    std::sort(con.data(), con.data() + con.size()); 
    auto itr = std::unique(con.begin(), con.end(), cmpVecs); 
    con.resize(itr - con.begin()); 
} 

void init(std::vector<vec3> &verts) { 
    removeDuplicates(verts); 
} 

VS 2012 오류 :

algorithm(3618): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion) 1> with 1> [ 1> _Scalar=float, 1> _Rows=3, 1>
_Cols=1 1> ]

관련 게시물 :

+1

'std :: sort'는 엄격한 약한 순서 술어가 필요하므로 비교 함수가 정확하지 않습니다. '{ if (lhs.x() dalle

+0

위의 설명에서 비교는 나를 위해 작동합니다. 그 독특한 matlab에 매우 공통적 임에도 불구하고, 이것은 찾기가 아주 어려웠습니다. –

답변

1

std::sort 당신이 사용하고자하는 비교기를 지정할 수 있습니다 사용할 수있는 재정을 가지고 예 :

struct vec3comp{ 
    bool operator()(const vec3 &lhs, const vec3 &rhs){ 
     return lhs.x() < rhs.x() && lhs.y() < rhs.y() && lhs.z() < rhs.z(); 
    } 
} mycomp; 

std::sort(con.data(), con.data() + con.size(),mycomp);` 

편집 : 람다 함수로 코드를 표시 할 수 있습니까? 그것은 잘 작동합니다.

+0

TBH, 제 정렬 방법이 올바르지 않다고 생각하지 않습니다. 나는 그것이 3 개당 대신에 float 단위로 정렬한다고 생각한다. 나는 위에 게시 한 링크를 복사했다. 또한 바이트 정렬되지 않았을 가능성이 있습니다 ... 지금 확인하십시오. – ffhighwind

+0

그래, static_assert는 size == 3 * sizeof (float)의 테스트에서 실패합니다. 이는 다소 나쁜 의미가 있습니다. 어느 쪽이든 그것은 ffhighwind

+0

nvm 나는 sizeof (sizeof())를하고 있었다. .. 그래서 나는 말했다. 구조체를 시도 할 때도 여전히 오류가 발생합니다. – ffhighwind

관련 문제