2013-05-27 3 views
4

개체를 가리키는 고유 포인터 집합이 있습니다. 때로는 이러한 객체에 대한 원시 포인터 중 일부를 표시하여 코드의 다른 부분이 객체로 처리 할 수 ​​있도록합니다. 이 코드는 포인터가 특정 고유 포인터 세트에 의해 유지되는 오브젝트를 가리키는 지 여부를 모르기 때문에 포인터가 가리키는 오브젝트가 고유 포인터 세트에 있는지 여부를 점검해야합니다. 간단한 코드에서고유 포인터 집합 검색

:

int* x = new int(42); 
std::set<std::unique_ptr<int>> numbers; 
numbers.insert(std::unique_ptr<int>(x)); 

numbers.find(x) // does not compile 

코드가 컴파일되지 않는 이유를 이해하지만, 내가 STL과 요소를 검색 할 수있는 방법을 생각할 수 없다. 내 요구 사항을 충족시키는 것이 있습니까? 아니면 수동으로 세트의 모든 요소를 ​​반복해야합니까? std::find_if(numbers.begin(), numbers.end(), [&](std::unique_ptr<int>& p) { return p.get() == x;});

+3

'std :: map >'... –

+0

'numbers.find (std :: unique_ptr (x))'는 어떨까요? 나는'set >'을 고집하고 싶다면, 임시'unique_ptr' 객체를 만드는 것이 유일한 선택이라고 생각합니다. –

+1

@ PhilippMatthiasSchäfer : 그것은'unique_ptr'에 의해 이미 소유 된 객체에 대해 unique_ptr을 생성 할 것입니다. 따라서 이중 삭제로 이어지는 나쁜 것입니다. 그리고 만약 그것이'unique_ptr'에 의해 소유되어 있지 않다면, 지금은 그렇습니다. 그래서 여러분이'release'하지 않으면 깨질 수 있습니다. –

답변

6

이 같은 std::find_if를 사용할 수 있습니까?

+9

이것은'set'의 모든 효율성을 잃어 버릴 것입니다. 왜냐하면 선형 접근이기 때문입니다. –

+0

@NicolBolas : 예,하지만 선형 시간으로 작업하는 것 외에 다른 방법은 없습니다. – Asha

+0

find_if는 기본적으로'for (it = set.begin(); it! = set.end(); ++ it) {if (* it == searching) return과 동일한 작업을 수행하지 않습니다. }'? 이것은 수동 반복에 비해 실행 시간이 동일 할 것입니다. 맞습니까? – Chris