将NSDictionary转换为std :: vector
问题描述:
我想将NSDictionary映射整数转换为浮点值,转换为C++ std :: vector,其中原始NSDictionary的键是向量的索引。将NSDictionary转换为std :: vector
我有代码,我认为会工作,但它似乎创建一个向量比字典中键值对的数量更大。我正在猜测它是如何处理我向矢量索引的。
任何帮助非常感谢。
这里是我的代码:
static std::vector<float> convert(NSDictionary* dictionary)
{
std::vector<float> result(16);
NSArray* keys = [dictionary allKeys];
for(id key in keys)
{
id value = [dictionary objectForKey: key];
float fValue = [value floatValue];
int index = [key intValue];
result.insert(result.begin() + index, fValue);
}
return result;
}
答
正在初始化向量与多家生成很多条目开始说起。在这种情况下,您的矢量将以16个元素开始,并且每个插入元素都将添加元素,因此您将以16 + N元素结束。
如果您想将元素更改为新值,只需指定给它。不要使用插入:
result[index] = fValue;
但是,你真的应该只使用map<int, float>
:
std::map<int, float> result;
NSArray* keys = [dictionary allKeys];
for(id key in keys)
{
id value = [dictionary objectForKey: key];
float fValue = [value floatValue];
int index = [key intValue];
result[index] = fValue;
}
答
既然你说你的钥匙应该成为指标到载体中,您可以将您的密钥进行排序。
未经测试的示例:
static std::vector<float> convert(NSDictionary* dictionary)
{
std::vector<float> result;
NSArray* keys = [dictionary allKeys];
result.reserve([keys count]); // since you know the extent
for (id key in [keys sortedArrayUsingSelector:@selector(compare:)])
{
id value = [dictionary objectForKey:key];
float fValue = [value floatValue];
int index = [key intValue];
result.push_back(fValue);
}
return result;
}
为什么不使用'std :: map'。它是STD中的NSDictionary的对应物。也许你的键没有排序,你不能在'std :: vector'上任意插入索引。你需要按顺序执行:0,1,2,3 ... –
因为我正在写一个插件,它给了我一个NSDictionary,并且希望将它传递给我使用的API,它需要一个std :: vector – ekj