2012-09-30 2 views
1

개체를 벡터에 보관하는 데 문제가 있으며 연산자를 사용하여 처리해야한다고 생각합니다.연산자 == 및 벡터 혼동

std::vector<Foo> vec; 
Foo a = Foo(); 
vec.push_back(a); 

... 

if(std::find(vec.begin(), vec.end(), a) < vec.end()) { 
    // Found 
} else { 
    // Not found 
} 

푸 컴파일 == 연산자를 필요로, 나는이

bool Foo::operator==(const Foo& rhs) { 
    return this == &rhs; 
} 

을하지만 vec.push_back, 내가 이해에서, 푸 객체의 복사본을 만들려고, 그래서 내 == 반환합니다 그릇된.

따라서 검색 할 때마다 절대로 발견되지 않습니다.

여기서 옳은 일은 무엇입니까? 나는 포인터의 벡터로 전환하는 것을 피하기를 바라고있다.

+0

당신이 쓸 수 포인터 대신 Foo의 데이터를 처리하려면'operator ==()'연산자를 사용 하시겠습니까? –

답변

2

Foo::operator==의 구현을 변경하여 ID를 확인하는 대신 Foo의 멤버 변수를 같게 비교합니다. 예를 들어 : 그것은 어떤 멤버 변수를 수정해서는 안와 푸의 const 인스턴스에 사용할 수 있어야하기 때문에

bool Foo::operator==(const Foo& rhs) const { 
    return get_a() == rhs.get_a() 
     && get_b() == rhs.get_b(); // and so on 
} 

참고이 또한 const 기능을 할 수있다.

+0

의미가 있습니다. 감사합니다. –

+0

const 인 경우 해당 연산자가 더 좋을 것입니다. –

+1

@BenjaminLindley 답변 됨. 나는 원래 최소한의 변화를 원했지만 이것은 좋은 지적이다. – akton

1

std :: vector <> (또는 대부분의 표준 컨테이너) 삽입시 사본을 만듭니다. 두 개의 Foo 객체가 같은지 자신의 주소가 동일하면 실제로 정의 할 수있는 것은 포인터를 std :: vector <>에 저장하는 것입니다. std :: vector <에 포인터를 저장하려면 std :: shared_ptr <>, std :: unique_ptr <>과 같은 스마트 포인터를 저장하는 것이 좋습니다.

만약 Foo가 복사하기에 너무 무거 우면 C++ 11에서 Foo Move-only를 만들거나 boost :: containers :: vector와 boost :: move를 사용하여 C++ 03에서만 이동할 수 있습니다.

아마도 멤버 변수를 비교하기 위해 ==() 연산자를 변경하는 것이 더 쉽습니다.

+0

모두 의미가 있지만 OP는 포인터를 저장하지 않습니다. – juanchopanza

1

귀하의 operator==은 신원이 메모리의 위치에 의해 정의된다는 것을 의미하지만, 벡터에 값을 추가하고 동일성을 기대한다는 사실은 신원이 위치에 의해 정의되지 않는다는 것을 나타냅니다. 당신이 다른 회원을 기반으로 정체성 정의가없는 어떤 이유로, 당신이 당신의 푸 개체에 고유 한 식별자를 추가 할 수 있습니다

, 코드에서 그 식별자를 비교할 수 있습니다

bool operator==(const Foo &rhs) 
{ 
    return this->m_id == rhs.m_id; 
}