2010-01-19 4 views
4

내가 높은 점수 테이블이 좀 파일 작업을하고 파일의 특정 영역을 조작해야높은 점수 테이블의 보관, 어떤 종류의 컨테이너?

name score 
name score 
.... 

같은 구조를 가지고 말해, 나는 용기에 저장하는 것이 작업을 수행하는 가장 좋은 방법을 생각 파일의 순서를 유지하고 컨테이너로 데이터 조작을 한 다음 파일로 다시 출력합니다.

나는 map< std::string, int >을 사용하는 것으로 생각했지만지도는 파일의 순서를 유지하지 않습니다. vector< pair< std::string, int >>이 더 좋을까요, 아니면 사용할 수있는 주문한지도가 있습니까? 필요한 경우 컨테이너에 이름을 반복해야합니다. multimap은 하나의 키를 유지하지만 그 키에 대해 여러 값을 허용한다고 생각합니다. 순서를 유지하지 않으므로 원하는 값이 아닙니다.

+0

주문 보존에 대해이 부분은 무엇입니까? 높은 점수 표가하는 것과 반대가 아닙니까? 그들은 새로운 데이터가있는 상태에서 스스로 재정렬해야합니다. – GManNickG

+0

글쎄, 나는 수동으로 순서를 정하고 있었지만 멀티 맵의 자동 정렬은 의미가있다. 멀티 맵은 값별로 정렬하지 않고 키별로 정렬합니다.이 경우 multimap 을 사용해야합니다. – Anonymous

답변

7

사용

std::vector< std::pair< std::string, int > > 

솔루션입니다.

HighestScoreEntry 클래스를 사용하고 표준 : 벡터 < HighScoreEntry>를 추가하면 나중에 데이터를 추가하고 클래스에 점수 처리 코드를 포함시킬 수 있습니다.

엔트리를 추가하려면 엔트리를 벡터의 끝으로 밀어 넣고 std::sort을 실행하십시오. HighScoreEntry에 대한 비교 연산자를 작성하십시오.

class HighScoreEntry 
{ 
public: 
    std::string name; 
    uint32 score; 

    bool operator<(const HighScoreEntry& other) const 
    { 
     // code that determines ordering goes here 
     return score < other.score 
    } 
}; 

최고 점수 테이블 : 정렬

std::vector<HighScoreEntry> highscores; 

:

std::sort(highscores.begin(), highscores.end()); 

가 같은 점수가 최고 기록에 대한 정렬 순서를 유지 타임 스탬프를 사용하고 비교에 추가합니다.

+0

사실 그와 비슷한 것을 가지고 있습니다. 조언 해 주셔서 감사합니다. – Anonymous

+1

나는 (멀티)지도가 더 좋을 것이라고 생각한다. 그것은 스스로를 정렬합니다. – GManNickG

+0

그래도 파일과 같은 순서로 있어야합니다. 나는. 그것은 읽혀지는 것과 동일한 순서로 읽혀집니다. – Anonymous

-1

필요한 경우 컨테이너에 이름을 반복해야합니다.

그래서 같은 이름을 벡터 쌍에 두 번 붙여 넣으십시오. 정말 대단한가요?

+0

아니요. 최선의 선택인지 궁금합니다 ... – Anonymous

+0

당신이하고있는 일은 * 조숙 한 최적화 *의 영역에 들어서고 있습니다. 그것이 추상적으로 "최선의"선택인지 여부는 문제가되지 않습니다. 중요한 것은 * 일을 끝내고 * 충분하다는 것입니다. –

+0

올바른 컨테이너를 사용하도록 요청하는 것은 조기 최적화의 반대입니다. – GManNickG

2
typedef std::pair<int, int> score_entry; // score, timestamp/serial 
typedef std::map<score_entry, std::string, std::greater<score_entry> > score_map; 

그것은 (내림차순) 점수와 타임 스탬프/일련의 지시, 같은 높은 점수의 중복을 허용합니다. (이전 타임 스탬프/시리얼을 먼저 나열하려면 음수를 입력하십시오.)

타임 스탬프 대신 일련 번호를 사용하면 multimap을 사용하지 않고도 복제를 허용 할 수 있습니다. 제안에 대한 Steve Jessop에게 감사드립니다!

+1

이제는 짧고 읽을 수있는 컨테이너 정의입니다.> –

+0

글쎄, 내 대답에 어리석은 일로 해소하는 것보다 훨씬 더 혼란스럽고 더 실망 스럽습니다. +1. –

+2

고마워요! 'typedef'를 사용하도록 편집했기 때문에 더 읽기 쉽습니다. :-) –

0

주문한지도를 원한다면 주문 점수를 정렬하고 순서를 유지하고 묶인 점수를 허용하려면 multimap<int, string>이어야합니다.

이것은 바보처럼 들리지만, 지구상의 어떤 것이 "매핑"되는지는 분명하지 않습니다. 높은 점수 테이블에서의 컨테이너 성능은 매우 중요하지 않으므로 pair<string,int> 벡터를 사용합니다.

0

왜 priority_queue를 사용합니까? 새로운 점수를 쉽게 추가 할 수 있어야합니다.

+0

물론 가능합니다. 필자는 개인적으로 boost :: array를 사용하여 스프레드 링크 된 목록의 반복자를 매핑합니다. 그러나 때로는 KISS에 좋을 수도 있습니다 (간단하게 유지하십시오 ...). –

+0

어떻게 반복 할 계획입니까? –

+1

@Kornel, 반복에 대한 좋은 지적. 나는 그 한계에 대해 잊었다. – ergosys

관련 문제