2012-03-22 4 views
0

C++에서 항목 기반 게시/구독 시스템을 작성하고 있습니다. 이 게임 엔진 std :: map에 형식 또는 구조체를 저장하는 중

  • 이벤트 데이터입니다 (표준 : :지도 -

    1. 이벤트 종류 (표준 : : 문자열)
    2. 엔티티 ID (부호 INT) : 내 일반적인 "이벤트"클래스는 세 부분으로 구성되어 있습니다 < 표준 : : 문자열, ???>)

    은 "이벤트 데이터"지도를 채우려면, 나는) INT, 문자열, 또는 Vector3 (구조체와 같은 모든 데이터 유형 또는 구조체를 저장 할 수 있어야합니다 몇 가지 예를 들어 보겠습니다. 어떻게해야합니까? 또는 아마도이 모든 작업을 수행하는 더 좋은 방법이 있습니다 ...

    관련없는 메모에서 이벤트 유형 및 데이터 이름에 char * 또는 문자열을 사용하는 것이 더 좋습니까?

  • +0

    어쨌든'std :: string'을 사용하십시오. – Puppy

    +0

    왜? (귀하의 판단에 의문을 제기하지 않고 단지 알고 싶습니다.) – jmegaffin

    +0

    더 쉽고, 표준적이고, 버그를 예방합니다. char *가 더 좋은 몇 가지 엣지 케이스가있을 수 있지만 std :: string을 사용하는 것이 정당화 될만한 이유는 거의 없을 것입니다. – Showtime

    답변

    3

    시도한 boost:any?

    이벤트 유형에 대해 왜 문자열을 사용하고 있습니까? std :: maps는 낮은 키 값에서 높은 키 값으로 정렬하여 저장됩니다. 이것은 내부적으로 문자열 정렬을 의미합니다. 가능한 한 간단하게 시작하고 계속 사용하십시오. enum을 사용하면지도를 훨씬 빠르게 만들 수 있습니다. 특히 알림 시스템의 기초가 될 것이라면 더욱 그렇습니다. 그들이 있는데도,

    char* key1 = "Hi"; 
    char* key2 = "Hi"; 
    unsigned int id; 
    std::map< char* ,unsigned int > mymap; 
    mymap.insert(std::pair<char*,unsigned int>(key1, id)); 
    mymap.insert(std::pair<char*,unsigned int>(key2, id)); //you've just created a duplicate entry 
    

    이유는 그 키 1과 키 2는 서로 다른 주소를 갖게됩니다

    마지막으로, 당신은지도가 예상대로 작동하지 않기 때문에, 문자의 *를 사용하지 않으 같은 문자열.

    +0

    필자는 열거 형을 사용하지 않을 것입니다. 그리고 아니, 나는 Boost를 사용한 적이 없다. 나는 그것을 시험해 보겠다. – jmegaffin

    +0

    오, 그래, 그건 의미가있다. 약간의 성능 향상이 필요하다고 생각하면 열거 형으로 전환합니다.) – jmegaffin

    +0

    유형에 대한 텍스트 설명을 원하면 언제나 std :: lines GetDescription (EventType t)의 행을 따라 함수를 사용할 수 있습니다. – Carl

    관련 문제