【问题标题】:Storing and accessing a pointer to an array in a std::map在 std::map 中存储和访问指向数组的指针
【发布时间】: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;
}

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

  1. 这有可能永远有效吗?
    (我以前从来不需要使用映射,也许我只是由于语法错误而产生错误......)或者换句话说,为什么我不能访问我存储在映射中的内存地址?

  2. 是否有另一种/更好(/实际可行)的方式来存储未知数量的数组并给它们一个“名称”以便以后访问和操作它们?

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

【问题讨论】:

  • 我认为你的意思是i &lt; 10,而不是循环条件中的i &lt; 3 * 10
  • 哦,是的,当然,在问题中更正了它
  • 为什么不使用vector 而不是原始数组?
  • 所以您已经得出结论,与普通数组相比,std::vector 会产生不可接受的性能损失,并且您决定将指向这些数组的指针存储在 std::map 中?
  • no evidence 分段错误。请发布 MCVE。此外,std::vector 会产生 no 开销。零。

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


【解决方案1】:

第一个问题的遮阳篷: 我尝试运行它,它运行没有问题,产生了预期的结果。我在上面使用了 valgrind,它没有报告未定义的行为。您的错误必须在其他地方,或者在您更改 for 循环的边界时已修复。

第二个问题的遮阳篷: 你有多少变量? 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。在这种情况下,我认为额外的空间复杂性并不重要。

【讨论】:

  • 非常感谢,是的,我发现这是与 googletest 结合使用的对象生成问题。 (因为我目前正在编写我的应用程序的核心并且我没有运行版本,所以我正在编写测试......) data_object 没有以正确的方式初始化......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多