2015-01-05 2 views
0

C++에서 lower_bound 함수를 사용하려고합니다. 1d 데이터 유형에 여러 번 사용되었습니다.char 문자열 배열에 C++ "lower_bound"적용

이제는 sorted array dict[5000][20]에 시도하여 size <=20의 문자열을 찾습니다. 일치시킬 문자열은 str입니다. http://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_bound으로 당

bool recurseSerialNum(char *name,int s,int l,char (*keypad)[3],string str,char (*dict)[20],int 
dictlen) 

{ 


    char (*idx)[20]= lower_bound(&dict[0],&dict[0]+dictlen,str.c_str()); 

    int tmp=idx-dict; 

    if(tmp!=dictlen) 
     printf("%s\n",*idx); 

} 

,이 기능은 "지난"일치, 즉 발견되지 않는 경우 (단 이상) tmp 동일 dictlen되어야의 인덱스를 반환 할 예정이다. 필자의 경우 항상 시작 색인을 반환합니다. 즉, tmp equal to 0이 모두 1입니다. dict 및 2에있는 문자열이 전달되었을 때 dict에없는 문자열이 전달되었습니다.

문제는 포인터 처리 및 전달에 있다고 생각합니다. 이 경우에는 벡터의 경우 사용할 수있는 default comparator을 사용할 수 있어야합니다. 나는 또한 명시적인 것을 전달하려고 시도했다. 나는 ALTERNATE는 등 벡터를 사용하는 것입니다 알고 있지만, 나는이 하나의 문제를 알고 싶습니다

bool compStr(const char *a, const char *b){ 
    return strcmp(a,b)<0; 
} 

-

나는이 비교를 시도했다. Google에서 검색 한 결과와 비슷하지만 비슷한 것은 없습니다.

+1

포인터에 대한 기본 비교기는 포인터를 비교합니다. 문자열을 비교하기 위해서는 자신의 비교자가 필요하다. [] (char * lhs, char * rhs) {return strcmp (lhs, rhs) <0; }'. – zch

+0

@zch - 필자가 사용하는 콤퍼레이터보다 위에 추가했습니다. 작동하지 않습니다. Morever, 나는 당신이 말하는 비교기의 문법을 이해하지 못한다. 제발, "[] (char * lhs, char * rhs) {return strcmp (lhs, rhs) <0;}"을 작동 구문에서 자세히 설명 할 수 있습니다. – user1412066

+1

이것은 [lambda expression] (http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B_.28since_C.2B.2B11.29)라는 익명의 펑터에 대한 C++ 11 문법입니다.C++ 03에 해당하는 클래스는'struct StrCmp {bool operator() {...}};'클래스이고'StrCmp()'를'comp' 인수로 전달합니다. – zch

답변

1

여기에는 두 가지 오해가 있습니다.

  1. std::lower_bound 요소가 정렬 된 범위에 속하는지 확인하지 않습니다. 대신 요소를 삽입 할 수있는 가장 왼쪽의 위치를 ​​찾지 만 순서를 어지럽히 지 않습니다.
  2. 문자열의 내용이 아니라 메모리 주소를 비교하고 있습니다.

dict은 내부 배열의 메모리 주소가 오름차순이라는 의미에서 정렬 된 범위 인 경우가 사실입니다. 이것에 관해서는 str.c_str() 거짓말은 물론 정의되지 않습니다. 실제로는 dict이 스택 객체이기 때문에 힙의 메모리 범위 (str.c_str()이 항상 거짓)가 스택의 메모리 범위보다 작은 경우가 종종 있습니다.이 경우 lower_bound은이 주소를 스택에 삽입하려는 경우 dict을 해석 할 때 정렬 된 주소 범위는 처음부터 그렇게해야합니다. 솔루션을

, operator<(char const *, std::string const &) 있기 때문에, 당신은 단순히

char (*idx)[20] = lower_bound(&dict[0], &dict[0] + dictlen, str); 

을 쓸 수 ...하지만 당신은 아마도 정말 std::find 찾는거야?

+0

나는 위의 것을 이해했다. 솔루션 주셔서 감사하지만 주소 대신 문자열을 비교하는 작업을 수행하기 위해 비교기를 오버로드하는 방법이 있어야합니다. 가능하다면 제발! – user1412066

+0

나중에 lower_bound (& dict [0], & dict [0] + dictlen, str.c_str(), compStr)'를 써 넣으면 편집 한 비교기에서 작동합니다. – Wintermute

+0

네, 맞습니다! 그것은 작동합니다. 나는 어리석은 무엇인가를했을 것임에 틀림 없었다. 어쨌든 테이크 어웨이 레슨이 "char *"인 경우 명시 적 비교기에서 지시하지 않는 한 int (포인터 저장 주소)로 처리됩니다. 그게 다야? – user1412066

관련 문제