【发布时间】:2016-05-18 00:21:32
【问题描述】:
场景是:
我正在为粒子模拟应用程序编写一个框架。
我需要为粒子添加各种属性,这些属性我还不知道,并且每个粒子都不同。由于一个属性会经常以时间关键的方式被访问和操作,我决定将它们存储在一个普通的 c 数组中。
我更喜欢按名称访问不同类型的属性(如 pos、vel、force 等)。
所以我决定使用std::map<const std::string,double*> 来存储浮点属性。
所以我的问题。我尝试将粒子属性值存储如下
double* attr = new double[3 * 10];
std::map<std::string,double*> doubleAttributes3d;
doubleAttributes3d.insert(std::make_pair("pos", attr));
for(int64_t i = 0;i<10;++i)
{
*(doubleAttributes3d["pos"] + 3 * i) = 1.0;
*(doubleAttributes3d["pos"] + 3 * i + 1) = 2.0;
*(doubleAttributes3d["pos"] + 3 * i + 2) = 3.0;
}
double * ptr = doubleAttributes3d["pos"];
for(int64_t i = 0;i<10;++i)
{
cout << *(ptr + 3 * i) << " ";
cout << *(ptr + 3 * i + 1) << " ";
cout << *(ptr + 3 * i + 2) << endl;
}
这会导致段错误。 特别是,每当我尝试访问数组的元素时。
-
这有可能永远有效吗?
(我以前从来不需要使用映射,也许我只是由于语法错误而产生错误......)或者换句话说,为什么我不能访问我存储在映射中的内存地址? 是否有另一种/更好(/实际可行)的方式来存储未知数量的数组并给它们一个“名称”以便以后访问和操作它们?
我知道这里有人问过类似的问题,但没有一个适合我的答案。
【问题讨论】:
-
我认为你的意思是
i < 10,而不是循环条件中的i < 3 * 10。 -
哦,是的,当然,在问题中更正了它
-
为什么不使用
vector而不是原始数组? -
所以您已经得出结论,与普通数组相比,std::vector 会产生不可接受的性能损失,并且您决定将指向这些数组的指针存储在 std::map 中?
-
有no evidence 分段错误。请发布 MCVE。此外,
std::vector会产生 no 开销。零。
标签: c++ arrays c++11 std stdmap