2012-05-01 5 views
1

문자열의 충분을 정렬하려고합니다. 가장 간단한 방법은 모든 충분을지도에 넣는 것입니다. 메모리를 효율적으로 사용하기 위해 접미사를 (str + i)로 전달합니다. 여기서 str은 char *이고 i는 시작 위치 접미사입니다. 그러나지도가 이러한 충분을 분류하지 않는다는 것을 알게되었습니다. 여기서 일례를 진행지도 및 하위 문자열

typedef std::map < char*, int,Comparator> MapType; 
MapType data; 

// let's declare some initial values to this map 
char* bob=(char*)"Bobs score"; 
char* marty=(char*) "Martys score"; 
data.insert(pair<char*,int>(marty+1,15)); 
data.insert(pair<char*,int>(bob+1,10)); 
MapType::iterator end = data.end(); 
for (MapType::iterator it = data.begin(); it != end; ++it) { 
    std::cout << "Who(key = first): " << it->first; 
    std::cout << " Score(value = second): " << it->second << '\n'; 
} 

출력하지만, 문자열을 비교 strcmp 표준 함수 밥 + 1 + 1 마티 올바르게 작동

 
    Who(key = first): obs score Score(value = second): 10 
    Who(key = first): artys score Score(value = second): 15 

이다. 그것은 marty + 1이 bob + 1보다 적다고 말합니다.

+0

는'Comparator' 무엇인가

비교 기능을 구현하기위한 올바른 방법은 다음과 같다? – hmjd

+1

'Comparator'는 어디에 정의되어 있으며 무엇을합니까? –

+0

물론 Comparator는 맵이 정의 된 (char *, int) ... – ShinTakezou

답변

5

map은 사전 순칭이 아닌 char*의 주소로 정렬됩니다. 키를 std::string으로 변경하거나 비교기를 정의하십시오.

편집 : 당신이 Comparator 만의 정의가 게시되지 않은 정의하려고했습니다 것처럼

것 같습니다. 다음은 예입니다

#include <iostream> 
#include <map> 
#include <string.h> 

struct cstring_compare 
{ 
    bool operator()(const char* a_1, const char* a_2) const 
    { 
     return strcmp(a_1, a_2) < 0; 
    } 
}; 

typedef std::map<const char*, int, cstring_compare> cstring_map; 

int main() 
{ 
    cstring_map m; 

    m["bcd"] = 1; 
    m["acd"] = 1; 
    m["abc"] = 1; 

    for (cstring_map::iterator i = m.begin(); i != m.end(); i++) 
    { 
     std::cout << i->first << "\n"; 
    } 

    return 0; 
} 

출력 :

 
abc 
acd 
bcd 
+0

에 대해 잘못되었거나 사용하는 비교기를 – ShinTakezou

+0

@ShinTakezou로 변경합니다. OP가 벌써 시도했을지도 모른다라고 생각해라. – hmjd

+0

strcmp에 대한 포함 cstring이 누락되었습니다. – ShinTakezou

0

사용자 지정 비교기를 정의, 예를 들어

class compare_char { 
    public: 
     bool operator()(const char* lhs, const char* rhs) { return strcmp(lhs, rhs); } 
}; 

현재 가지고 어떤 대신이 비교기를 사용하여 맵을 정의합니다. 또는 값으로 작동하는 비교 연산자가있는 키 유형의지도를 사용하면 std :: string이 더 좋습니다. 현재 char * 유형을 비교하는 키로 char *를 사용하는 맵이 있습니다. 내용이 아니라 포인터의 값.

+0

lhs가 rhs보다 크거나 작을 때 strcmp가 0이 아닌 값 (true)을 반환하기 때문에 이것이 작동하지 않을 것으로 생각됩니다. 당신은'<0'을 추가해야합니다 (hmjd 응답에서와 같이) – ShinTakezou

0

사용중인 비교기 클래스 또는 기능을 오류가 발생한 부분부터 추가해야합니다.
strcmp와지도 비교 기능간에 약간의 차이가 있습니다. 하는 == B의 경우 0을 리턴 STRCMP -1 < B, 1> B
완 true를 반환하는 경우에는 B < 경우

는 false.

bool operator() (char* lhs, char* rhs) const 
{ 
     return strcmp(lhs,rhs) < 0; 
} 
+0

예, 도움이되었습니다! 고마워요! –