2013-04-24 2 views
0

Person이라는 구조체에 대한 포인터의 링크 된 목록으로 구성된 데이터베이스를 검색해야합니다. Person 안에는 이름, 성, 사회 보장 등 많은 데이터가 있습니다. 그것은 모두 허구이며 중요하지 않습니다. 내 문제는 검색을 위해 구조체의 어느 부분이 비교되는지를 결정하는 사용자 입력을 기반으로 검색을 수행해야한다는 것입니다. 모든 데이터가 struct Person의 멤버로 저장되었으므로 (8 개의 검색 함수를 작성하지 않은 것처럼) 매핑하는 것이 가장 좋은 방법이라고 생각합니다. 그러나 매핑의 내 이해는 거의 존재하지 않을만큼 가난합니다. . 관련 코드는 다음과 같습니다.C++ map을 사용하여 struct/class에 액세스하십시오.

List * find(List * database, //mapping stuff, string name) 
{ 
    //run search 
    return database; 
} 

void search(List * database) 
{ 
    string field, searchtype, userinput; 
    cout << "To search for a person, enter information in this format: 'field equal 
    value' or 'field begins value'. Type 'clear' to 
    return to original database. Type 'exit' to leave the program\n"; 

while(field != "exit") 
{ 
    cin >> field >> searchtype >> userinput; 
    if(userinput == "firstname") //this is just for example, I would have to write one of these out for each parameter. 
    { 
     List * smallerdb = find(database, map(//mapping stuff?), string userinput); 
    } 
} 
} 

이것은 학교용이므로 다른 라이브러리를 사용하는 것이 좋습니다. 고맙습니다!

+0

매핑 할 필요가 없습니다. 비교할 필드의 "상태"로 초기화되는 매개 변수화 된 * comparator *가 필요합니다. 그런 다음 비교기를 사용하십시오 (가능성이있는 펑터). – WhozCraig

+0

검색 함수에 포인터를 멤버로 전달하고이를 사용하여 목록의 각 항목에서 데이터를 검색 할 수 있습니다. – antlersoft

+0

필자가 매핑을 위해 펑터를 착각하고 있다고 생각하지만, 나는 여전히 펑터 (functor)에 대해서는 매우 모호합니다. 나를 올바른 방향으로 인도 할 수 있다고 생각하니? – musicman1007

답변

0

각 데이터 유형이 다르게 비교되어야하므로 명시 적으로 운이 좋지 않은 데이터 유형을 알지 못합니다. 문자열은 알파벳순으로 비교되고 숫자는 값으로 비교되며 다른 사용자 정의 데이터 유형이 있는지 확실하지 않습니다.

각 사례 별 시나리오를 거치지 않고 여기에 옵션을 많이 갖고 있지 않습니다. 예 :

if type == 'name'    // compare each Person.name as string 
    else if type == 'socialSecurity' // compare Person.socialSecurity as int 
    else if ... 

다음은이 코드를 좀 더 강력하게 만들기위한 제안입니다.

각 경우에 검색 논리를 처리하는 대신 두 개의 비교 방법을 알려주는 함수 포인터를 반환 할 수 있습니다. Persons. 실제 함수는 이름, 나이, 사회 보장 또는 기타로 비교할 수 있지만 두 개의 Person 개체를 비교하는 방법을 알려주는 함수 포인터가 있으면 검색 기능에서 신경 쓸 필요가 없습니다.