set에 stock 구조체를 자료형으로 사용하려다가 막혀서 작성한 글이다.
https://chanhuiseok.github.io/posts/algo-46/
stock구조체는
struct stock {
int price;
int index;
int enteredTime;
};
이렇게 생겼고, 단순히 set<stock> s로 선언하니 오류가 났다.
오류 C2678 이항 '<': 왼쪽 피연산자로 'const _Ty' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.
따라서 set은 <연산자를 사용하는구나 하고 <연산자를 오버로딩해줬다.
struct stock {
int price;
int index;
bool operator<( const stock& other) {
return index <= other.index;
}
};
그래도 오류가 계속 나서 다시 한번 오류를 읽어보니
왼쪽 피연산자로 'const _Ty' 형식을 사용하는
왼쪽 피연산자가 const_Ty형식을 사용해야 한다.
따라서 함수에 const를 붙여 멤버변수도 변경을 못하게 해주니 해결되었다.
struct stock {
int price;
int index;
bool operator<( const stock& other)const {
if (index != other.index)
return index < other.index;
else if (price != other.price) return price < other.price;
return false;
}
};
set<stock> s;
구조체 밖에 비교함수를 선언하려면
struct stock {
int price;
int index;
};
struct compare {
bool operator()(const stock& a, const stock& b)const {
if (a.index != b.index) return a.index <= b.index;
else if (a.price != b.price) return a.price <= b.price;
return false;
}
};
이런식으로 stock 구조체 인자 두개를 받아 연산자 ()를 오버로딩해주면 된다.
주의할 점은 strict weak ordering을 만족해야한다.
비교함수에서 만약 두값이 같다면 false를 리턴해야한다!