우선 순위 대기열 , 옵션 (12)의 구성 에서 말합니다 .
template< class InputIt >
priority_queue( InputIt first, InputIt last,
const Compare& compare = Compare(),
Container&& cont = Container() );
그러나 나는 이것을 어떻게 사용하는지 모른다. 비어 있지 않은 std::unordered_set<std::shared_ptr<MyStruct>> mySet
이 있고 우선 순위 대기열로 변환하고 싶습니다. 또한 비교기 구조체를 만듭니다 MyComparator
.
struct MyComparator {
bool operator()(const std::shared_ptr<myStruct>& a,
const std::shared_ptr<myStruct>& b){...}
};
이제 myQueue
더 나은 방법으로 새 priority_queue 를 어떻게 구성 할 수 있습니까? 다음을 사용했고 작동합니다.
std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator>
myQueue(mySet.begin(), mySet.end());
벡터와 deque를 모두 벤치마킹했는데 deque가 크기가 상대적으로 클 때 (~ 30K) 벡터보다 성능이 우수하다는 것을 알았습니다. 의 크기를 이미 알고 있으므로 해당 크기의 mySet
데크를 만들어야합니다. 그러나 어떻게 내 자신의 비교기와 미리 정의 된 deque로이 priority_queue를 만들 수 myDeque
있습니까?
std::deque
보다 나은 성능 을 제공 하는 것으로 이미 결정 했으므로 .NET Framework std::vector
를 구성하는 방법과 관련하여 수행 할 수있는 작업이 많지 않다고 생각합니다 priority_queue
. 이미 보셨 듯이 std::deque::reserve()
방법 이 없으므로 미리 할당 된 메모리로 deque를 만드는 것은 불가능합니다. 대부분의 사용 사례에서 이것은 문제가되지 않습니다. 왜냐하면 deque 대 벡터의 주요 특징은 새로운 요소가 삽입 될 때 deque가 요소를 복사 할 필요가 없다는 것입니다.
여전히 원하는 성능을 얻지 못한 경우 원시 포인터를 저장하거나 (스마트 포인터를 외부에 유지) 단순히 unordered_map
일반 포인터로 변경 map
하고 컨테이너가 제공하는 순서에 의존하는 것을 고려할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다