我见过人们建议使用boost :: any来制作异构地图。即
map<string,boost::any>
有没有人幸运地存储(并成功使用)存储在地图中执行该技术的数组?
我能够做到以下几点:
boost::array<char,100> myArr;
map<string,boost::any> myMap;
myArr[51] = a;
myMap["imageData"] = myArr;
这个问题是这似乎将整个数组存储在内存中两次。 如果我稍微改变它并执行此操作:
boost::array<char,100> myArr;
map<string,boost::any> myMap;
myArr[51] = a;
myMap["imageData"] = &myArr;
我不知道如何从地图中取出数据。如何创建boost::array<char,100>
指针?我可以吗?有没有其他人能够以更优雅的方式做类似的事情或有什么想法做类似的事情?
最初,我想将char[100]
存储到地图中,但我找不到在地图中投射一次的方法(为了使用地图中的数据,必须将其转换为正确的类型)。一个允许我从地图中获取char[someSize]
的解决方案将是理想的。
答案 0 :(得分:0)
如果您没有使用boost :: any,例如执行以下操作:
map<string, vector> myMap;
myMap["imageData"] = vector(100);
编译器(在我的情况下是GCC 4.6)会自动避免额外的副本。出于某种原因,boost :: any阻止了这一点。一种可能的解决方案是使用shared_ptr:
typedef boost::array<char, 100> Image;
map<string, boost::any> myMap;
myMap["imageData"] = boost::shared_ptr<Image>(new Image());
在容器中使用shared_ptr往往是一个更好的解决方案,使用您在问题中建议的真实指针。当没有变量指向它时,图像将被销毁,从而避免程序员手动释放其内存。
然而,根据图像的大小,在局部变量超出范围之前有两个副本的开销可能不会那么高。因此,您还应该考虑保留当前解决方案的可能性。