2012-03-07 7 views
1

문제가 발생하여 해결할 수없는 문제가 발생합니다.해당 값 중 하나를 사용하여 벡터에서 객체 찾기

class1 
{ 
private: 
    int identifier; 
    double value; 
public: 
    setters,getters,etc... 
} 
class2 
{ 
private: 
    vector<class1> objects; 
    vector<int> some_value; 
    vector<double> other_value; 
... 
} 

문제 난 (Class2의 구성원 기능으로부터)이 클래스 1 객체 식별자가 두 번째 클래스의 객체에서 객체의 벡터를 검색 할 필요가있다 : I는 두 개의 클래스를 갖는다. ..

int getObj(const int &ident, double &returnedValue, double &returnedOther_value) 
{ 
    int p; 
    p = find(objects.begin()->getIdentifier(),objects.end()->getIdentifier(),ident); 
    .. 

다음 나는 두 클래스에서 (const가 아닌) 멤버 변수 값과 OTHER_VALUE 대응의 발견 반복자 값에서 반환 할 수있는 방법을 찾으려했지만, 코드 그래서 : 내가 좋아하는 뭔가를 시도 지금까지는 검색을 모두 잘못했을 가능성이 높으므로 컴파일되지 않습니다. find (또는 다른 알고리즘)로이 작업을 수행 할 수있는 방법이 있습니까? 아니면 알고리즘없이 이전 작업 실현을 고수해야합니까?

+0

에 예를 추가 한 당신은 const를 참조로'int's을 통과 할 필요가 없습니다. 그것들은 값에 의해 전달되므로 (원래의 값을 변경할 수는 없습니다), 값으로 int를 전달할 때 오버 헤드가 없습니다. – MikMik

답변

1

사용자 정의 술어와 함께 find_if를 사용해야합니다. 예 :

class HasIdentifier:public unary_function<class1, bool> 
{ 
public: 
    HasIdentifier(int id) : m_id(id) { } 
    bool operator()(const class1& c)const 
    { 
     return (c.getIdentifier() == m_id); 
    } 
private: 
    int m_id; 
}; 


// Then, to find it: 
vector<class1>::iterator itElem = find_if(objects.begin(), objects.end(), HasIdentifier(ident)); 

아직 테스트하지 않았으므로 약간의 조정이 필요합니다.

C11을 사용 중이라면 람다를 사용할 수있을 것 같지만 사용하지 않아 배울 기회가 없습니다.

업데이트 : http://ideone.com/D1DWU

+0

이것은 매력처럼 작동했습니다! 정말 고맙습니다. 이제는 클래스 2에서 other_value vector의 값을 반환하는 방법을 알아야합니다. 이는 인덱스에 의해 객체 벡터에서 발견 된 값과 일치합니다. 제가 물었던 것뿐만 아니라 벡터의 인덱스도 얻을 수있는 방법이 있습니까? 그것은 내 문제를 깨끗하게 해결할 것입니다. – nutter

+1

다음과 같이 iterator에서 벡터 요소의 인덱스를 찾을 수 있습니다 :'size_t index = it - v.begin();' – MikMik

+0

고맙습니다. 나는 이것이 가능하다는 것을 결코 알지 못했다. 매일 새로운 것을 배울 것 같네요. :) – nutter

관련 문제