作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有没有办法在 C++ 中创建哈希的哈希?
实际上,我正在尝试做您可以在 Perl 中做的事情,但只能在 C++ 中做。这是我希望在 C++ 中发生的 Perl 代码示例
%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/]
},
);
需要注意的是 gameobjects 中的哈希值可以存在也可以不存在...即 position 可能存在于 gameobject1 中但可能不存在于 gameobject35 中。
有什么想法吗?
最佳答案
Perl 哈希让您可以使用任何值作为值。 C++ 是一种静态类型语言,它不会让您这样做:您必须准确指定您希望散列中的值(在 C++ 术语中,映射)具有的类型。
这是使用 C++11 和 boost 的可能解决方案,其中包含一些强类型:)
#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>
获得在 map 中存储任何内容的能力。但是,这需要您在从 map 中获取每个值之前测试每个值的类型。如果只有一组特定的类型是可能的,你可以使用比 boost::any
更强类型的东西。 , 比如 boost::variant
.
关于c++ - 如何在 C++ 中创建散列的散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798900/
我是一名优秀的程序员,十分优秀!