2011-03-31 2 views
4

나는 std :: shared_ptr의 컨테이너를 가지고 있습니다. std :: equal을 사용하여 두 컨테이너를 비교하고 싶습니다. 클래스 A에는 연산자 ==가 정의되어 있습니다. 각 요소가 shared_ptr에 정의 된 연산자가 아닌 == 연산자를 사용하여 동등한 지 비교해보고 싶습니다.shared_ptr의 컨테이너에서 C++ std :: equal을 사용합니다.

평등하게 전달하려면 함수 또는 함수 객체를 만들어야합니까? 또는 (<functional>에 정의 된 것과 같은) 더 단순한 기본 제공 항목이 있습니까?

답변

7

std::shared_ptr을 사용할 수 있습니다. C++ 0x의 일부가 이미 활성화되어 있습니다).

당신을 도울 <functional>에 아무것도 없다,하지만 뭔가 부스트에있다 : 나는했습니다 indirect iterator

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <memory> 
#include <boost/iterator/indirect_iterator.hpp> 
int main() 
{ 
     std::vector<std::shared_ptr<int>> v1; 
     std::vector<std::shared_ptr<int>> v2; 
     v1.emplace_back(new int(1)); 
     v2.emplace_back(new int(1)); 

     bool result = 
      std::equal(boost::make_indirect_iterator(v1.begin()), 
         boost::make_indirect_iterator(v1.end()), 
         boost::make_indirect_iterator(v2.begin())); 
     std::cout << std::boolalpha << result << '\n'; 
} 
+0

고맙지 만 부스트 의존성을 추가하는 것을 피했습니다. 너무 좋지 않아서 정확히 내가 원하는 걸 ... – Matt

+0

@Matt : 당신은 항상 자신의 역 참조 반복자를 작성할 수 있습니다. http://stackoverflow.com/questions/352152/is-there-a-dereference-iterator-in-the-stl/352162 # 352162 – Cubbi

+0

멋지군요,이 경우에는 간단하기 때문에 함수 객체를 계속 사용한다고 생각합니다.하지만이 후에도 비슷한 기능이 필요할 경우 흥미로운 아이디어입니다. – Matt

3

당신은 람다를 지원하는 컴파일러를 가지고 가정, 다음과 같은 일을 할 수있는 아이템은 이제까지 널 없음을 보낸 사람 (당신은 함수 또는 함수 객체 또는 람다 식을해야합니다

bool CompareA(const vector<shared_ptr<A>>& first, 
       const vector<shared_ptr<A>>& second) { 

    return equal(first.begin(), first.end(), second.begin(), 
       [](const shared_ptr<A>& item1, const shared_ptr<A>& item2) -> bool{ 
        return (*item1 == *item2); 
       }); 
} 
+0

아마도 그들을 조금 비싼 복사하기 때문에, const를 참조로'shared_ptr' 년대를 통과하는 것이 좋습니다. – Cubbi

+0

@Cubbi True 또한 참조 횟수를 불필요하게 증가시킵니다. 코드가 변경되었습니다. – bsruth

0

내가 개인적으로 가장 좋은 방법 일 것입니다 함수 객체를 생각하고 ... 모든 <functional>에서 볼 수있는 올바른 비교 유형을 가지고에 따라 달라집니다, 그리고 만약 당신이 포인터를 비교하고 싶지 않았어, 당신은 어쨌든 그들이 가리키고있는 객체에 대한 포인터의 역 참조가 필요합니다 ... 나는 자동으로 그 참조를 수행하는 STL의 도우미를 보지 못합니다.

감사합니다,

제이슨

+0

그래, 그게 내가 원했던거야, 나는 그것도 존재하지 않는다고 생각했지만 어쩌면 나는 뭔가를 놓쳤다. – Matt