如何在C ++中创建哈希散列? [英] How to create a hash of hashes in C++?

查看:277
本文介绍了如何在C ++中创建哈希散列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以在C ++中创建哈希哈希?

Is there a way to create a hash of hashes in C++?

有效地,我正在尝试做您可以在Perl中完成的工作,但仅限于C ++. 这是我想在C ++中发生的Perl代码示例

Effectively I am trying to do what you can do in Perl but only in C++. Here is an example of Perl code I would like to have happen in C++

%hash = (
gameobject1 => {
    position => {
        x_loc => 43,
        y_loc => 59,
    }
    rect_size => {
        width => 5,
        height => 3,
    }
    collidable => 1,
    sounds => {
        attack => "player_attack.ogg",
        jump => "player_jump1.ogg",
        jump_random => [qw/player_jump1.ogg player_jump2.ogg player_jump3.ogg/]
    }

},
gameobject2 => {
    position => {
        x_loc => 24,
        y_loc => 72,
    }
    rect_size => {
        width => 2,
        height => 4,
    }
    sounds => {
        attack => "goblin_attack.ogg",
    }
        items => [qw/sword helmet boots/]
},
);

要注意的是,游戏对象中具有的散列可以存在或不存在……即位置可能存在于gameobject1中,但可能不存在于gameobject35中.

The thing to note is the hashes with in gameobjects can exist or not... i.e. position might exist in gameobject1 but may not exist for gameobject35.

有什么想法吗?

推荐答案

Perl哈希使您可以将任何东西用作值. C ++是一种静态类型的语言,它不允许您这样做:您必须确切指定希望哈希(在C ++术语中,映射)中的值具有哪种类型.

Perl hashes let you use anything for values. C++ being a statically typed language, it won't let you do that: you have to specify exactly what type you want the values in the hash (in C++ lingo, the map) to have.

这是使用C ++ 11和boost的可能解决方案,其中带有一些强类型:)

Here's possible solution with C++11 and boost, with some strong typing thrown in :)

#include <map>
#include <vector>
#include <string>
#include <boost/optional.hpp>

// Coordinates are always like this, aren't they?
struct coords {
    int x_loc;
    int y_loc;
};

// Dimensions are always like this, aren't they?
struct dims {
    int width;
    int height;
};

// Sound maps: each string key maps to a vector of filenames
typedef std::map<std::string, std::vector<std::string>> sound_map;
// Item lists: looks like it's just a collection of strings
typedef std::vector<std::string> item_list;

// Fancy names to improve readability
enum collidability : bool {
    collidable = true,
    not_collidable = false
};

// A structure to describe a game object
struct game_object {
    // An optional position
    boost::optional<coords> position;
    // An optional rectangle size
    boost::optional<dims> rect_size;
    // Assuming "false" can mean the same as "no collidable key"
    bool collidable;
    // Assuming an "empty map" can mean the same as "no map"
    sound_map sounds;
    // Assuming an "empty vector" can mean the same as "no vector"
    item_list items;
    // If any of the above assumptions is wrong,
    // sprinkle boost::optional liberally :)
};

// Finally, values for our "hash"
std::map<std::string, game_object> hash {
    { "game_object1",
      {
        coords { 43, 59 },
        dims { 5, 3 },
        collidable, // remember those fancy names?
        sound_map {
             { "attack", { "player_attack.ogg" } },
             { "jump", { "player_attack.ogg" } },
             { "jump_random", { "player_jump1.ogg", "player_jump2.ogg", "player_jump3.ogg" } }
        },
        item_list {}
    } },
    { "game_object2",
      {
        coords { 24, 72 },
        dims { 2, 4 },
        not_collidable,
        sound_map {
             { "attack", { "goblin_attack.ogg" } }
        },
        item_list { "sword", "helmet", "boots" }
    } },
    { "game_object25",
      {
        boost::none, // no position
        dims { 2, 4 },
        not_collidable,
        sound_map {
             { "attack", { "goblin_attack.ogg" } }
        },
        item_list { "sword", "helmet", "boots" }
    } }
};

如果您确实想要类似Perl散列的Perl散列之类的内容,则可以使用std::map<std::string, boost::any>来获取将任何内容存储在地图中的功能.但是,这要求您先测试每个值的类型,然后再从地图中获取它.如果只能使用某些类型的类型,则可以使用比boost::any更强类型的内容,例如boost::variant.

If you really want something like a Perl hash of Perl hashes, you can use std::map<std::string, boost::any> to get the ability to store anything in the map. However, this requires you to test for the types of every value before obtaining it from the map. If only a certain set of types is possible, you can use something more strongly-typed than boost::any, like boost::variant.

这篇关于如何在C ++中创建哈希散列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆