C++ 在std::map中存储和访问指向数组的指针

C++ 在std::map中存储和访问指向数组的指针,c++,arrays,c++11,std,stdmap,C++,Arrays,C++11,Std,Stdmap,情况是: 我正在为粒子模拟应用程序编写一个框架。 我需要为粒子添加各种属性,我还不知道这些属性,每个粒子都有不同的属性。由于属性经常以时间关键的方式进行访问和操作,所以我决定将它们存储在一个普通的c数组中。 我更喜欢按名称访问不同类型的属性(如pos、vel、force等)。 所以我决定使用std::map来存储浮点属性 所以我的问题。我尝试存储粒子属性值,如下所示 double* attr = new double[3 * 10]; std::map<std::string,double

情况是: 我正在为粒子模拟应用程序编写一个框架。 我需要为粒子添加各种属性,我还不知道这些属性,每个粒子都有不同的属性。由于属性经常以时间关键的方式进行访问和操作,所以我决定将它们存储在一个普通的c数组中。 我更喜欢按名称访问不同类型的属性(如pos、vel、force等)。 所以我决定使用
std::map
来存储浮点属性

所以我的问题。我尝试存储粒子属性值,如下所示

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;
}
double*attr=新的双精度[3*10];
std::map doubleAttributes3d;
doubleAttributes3d.insert(std::make_pair(“pos”,attr));

对于(int64_t i=0;i第一个问题的答案: 我尝试运行它,它运行时没有问题,产生了预期的结果。我对它使用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,速度上的差异也是显著的。我认为在这种情况下,额外的空间复杂性并不重要。

我想你的意思是
I<10
而不是
I<3*10
在循环条件中。哦,是的,当然,在估计为什么不使用
vector
而不是原始数组?因此,您得出结论,与普通数组相比,std::vector会产生不可接受的性能影响,并且您决定将指向这些数组的指针存储在std::map中?这是一个分段错误。请发布MCVE。此外,
std::vector
不会产生任何开销。零。非常感谢,是的,我发现与googletest结合使用的对象生成有问题。(因为我目前正在编写应用程序的核心,并且没有运行版本,所以我正在编写测试…)数据对象没有以正确的方式初始化。。。