在std :: map

时间:2016-02-08 10:56:59

标签: c++ arrays c++11 std stdmap

情景是: 我正在为粒子模拟应用程序编写框架。 我需要为粒子添加各种属性,这些属性我还不知道,并且每个粒子都有所不同。由于属性会以时间关键的方式被访问和操作,我决定将它们存储在普通的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;
}

导致段错误。 特别是,每当我尝试访问数组的元素时。

  1. 这种情况有可能发挥作用吗? (我以前从来不需要使用地图,也许我只是因语法错误而产生错误......)或者换句话说为什么我不能访问存储在地图中的内存地址?

  2. 是否存在另一种/更好(/实际工作)的方式来存储未知数量的数组并给它们一个&#34;名称&#34;为了以后访问和操作它们?

  3. 我知道这里有类似的问题,但没有一个答案适合我。

1 个答案:

答案 0 :(得分:3)

第一个问题&nbsp; awnser: 我试图运行它,它运行没有问题,产生预期的结果。我在上面使用了valgrind,它没有报告任何未定义的行为。您的错误必须在其他地方,或者在您更改for循环的范围时修复了它。

第二个问题&nbsp; awnser: 你有多少变量? std :: map仅在存在大量变量且大多数粒子未设置时才有用。 在大多数情况下,使用枚举索引属性会更加舒适和快得多,可以用来处理标准c数组。例如:

enum pp {
   POS,
   VEL,
   FORCE,
   CHARGE,
   MASS,
   ELECTRON_CONFIGURATION,
   ppMax
 }
 double* particles[1000][ppMax];
 particles[0][POS] = new new double[3 * 10];
 // et cetera

我对类似问题进行了基准测试,速度差异很大,即使我必须将所有未使用的指针设置为nullptr。在这种情况下,我不认为额外的空间复杂性很重要。