Say I have a high score table structured like
name score
name score
....
I need to do some file operations and manipulate certain areas of the file, and I thought the best way to do this would be to store it in a container that preserved the order of the file, do the data manipulation with the container, then output back to the file.
I considered using a map< std::string, int >
, but a map wouldn't preserve the order of the file. Would a vector< pair< std::string, int >>
be better, or is there some kind of ordered map I can use? I also need the container to repeat a name if necessary. I think a multimap keeps one key, but allows multiple values for that key, which isn't what I want since it wouldn't preserve order.
Use the
std::vector< std::pair< std::string, int > >
solution.
Or even better, do a HighScoreEntry class, and have a std::vector< HighScoreEntry > -- then you'll be able to add additional data to it later, and embed score handling code in the class.
To add an entry, push the entry to the end of the vector, and run std::sort
on it, just remember to write a comparison operator for 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
}
};
Highscore table:
std::vector< HighScoreEntry > highscores;
Sorting:
std::sort( highscores.begin(), highscores.end() );
To preserve sort order for highscores that have the same score, use a timestamp, and add it to the comparator.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With