| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | template <class T, class Compare = std::less> //디폴트 값은 최소힙입니다.class Heap{public: struct Comp2 { bool operator()(const T& lhs, const T& rhs) { return Compare()(rhs, lhs); } };private: std::vector datas;public: //기본 생성/대입자 Heap() = default; virtual ~Heap() = default; Heap(const Heap&) = default; Heap(Heap&&) = default; Heap& operator=(const Heap&) = default; Heap& operator=(Heap&&) = default;public: //중괄호 초기치 대응 Heap(std::initializer_list init) : datas(init) { std::make_heap(datas.begin(), datas.end(), Comp2()); } Heap& operator=(std::initializer_list init) { datas = init; std::make_heap(datas.begin(), datas.end(), Comp2()); }public: //vector와의 호환용 Heap(const std::vector& vec) : datas(vec) { std::make_heap(datas.begin(), datas.end(), Comp2()); } Heap(std::vector&& vec) : datas(vec) { std::make_heap(datas.begin(), datas.end(), Comp2()); }public: //vector와의 호환용 operator const std::vector&() const { return datas; } operator std::vector && () { return std::move(datas); }public: //최대 힙을 기준으로, 최대값을 가져옵니다. T & front() { return datas.front(); } const T& front() const { return datas.front(); }public: //요소를 추가합니다. void push(const T& value) { datas.push_back(value); std::push_heap(datas.begin(), datas.end(), Comp2()); } void push(T&& value) { datas.push_back(std::move(value)); std::push_heap(datas.begin(), datas.end(), Comp2()); }public: //최대 힙을 기준으로, 최대값을 제거합니다. void pop() { std::pop_heap(datas.begin(), datas.end(), Comp2()); datas.pop_back(); }public: void clear() //힙을 초기화합니다. { return datas.clear(); } bool empty() const //비었으면 true를 반환합니다. { return datas.empty(); } bool not_empty() const //비어있지 않으면 true를 반환합니다. { return !datas.empty(); } size_t size() const //힙의 크기를 반환합니다. { return datas.size(); }};Colored by Color Scripter | cs |
여기에 요약글 내용을 입력해 주세요.
여기에 요약글 내용을 입력해 주세요.