보통 < operator를 이용한다. x라는 데이터가 set에 있는지 없는지 검사를 다음과 같이 한다.
!(x<y) && !(y<x)
그런데 x가 edge를 나타내는 등, 구조체인 경우, less operator를 지정할 수 있다.
typedef struct Edge
{
int v1, v2, w;
bool operator <(const Edge &rhs) const{
bool b = (v1 < rhs.v1 || v2 < rhs.v2);
return (b);
}
} edge;
이렇게 하면 (3, 7) 과 (7, 3)을 비교하는 과정에서 문제가 생긴다.
http://stackoverflow.com/questions/13548472/using-stdset-find-with-struct-data
typedef struct Edge
{
int v1, v2, w;
bool operator <(const Edge &rhs) const{
bool b = v1 < rhs.v1 || (v1 == rhs.v1 && v2 < rhs.v2);
return (b);
}
} edge;
위와 같이 검사해야 제대로 작동한다.
추가로 less와 greater는 다음과 같이 직접 구현할 수 있다. visual studio 2012부터는 less만 기본으로 제공하고 greater등은 제공하지 않는것 같다.
template <class T>
struct _less
{
bool operator()(const T& _Left, const T& _Right) const
{
return (_Left < _Right);
}
};
template <class T>
struct _greater
{
bool operator()(const T& _Left, const T& _Right) const
{
return (_Left > _Right);
}
};
각 컨테이너에서 다음과 같이 선언하여, comparator를 지정할 수 있다.
priority_queue<edge, vector<edge>, _greater<edge> > pq;
set<edge, _less<edge> > s;
별도로 comparator를 지정하지 않으면, less가 default로 지정된다.
priority_queue<edge, vector<edge> > pq;
set<edge > s;
'c/c++' 카테고리의 다른 글
c++11/boost관련 글 링크 (0) | 2012.11.30 |
---|---|
크기 0짜리 배열 (0) | 2012.10.04 |
SSE2를 이용한 행렬 곱하기 (1) | 2012.09.13 |
행렬 곱 row만으로 연산하기 (0) | 2012.09.11 |
c++ vector 등 연속 메모리 컨테이너를 배열처럼 쓰는 방법 (0) | 2012.09.09 |