c++ - C++ STL 容器集的奇怪行为

标签 c++ stl set

我在使用集合时有一些非常奇怪的行为(它实际上是集合的 3d vector )。我在循环结束时有以下内容(评论是第四次循环发生时的行为,所以它不会马上发生)

cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][0]=i*xgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][1]=(i+1)*xgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][2]=j*ygridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][3]=(j+1)*ygridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][4]=k*zgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][5]=(k+1)*zgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

grid_rank_lookup[box_counter]=use_rank;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

box_counter++;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

use_rank=(use_rank+1)%world.size();
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

particles_celllistgrid_rank_lookupgrid_locations的定义是:

vector<vector<vector<set<int> > > > particles_celllist;
map<int,vector<double> > grid_locations
map<int,int> grid_rank_lookup

注意:第一个是局部变量,而另外两个是函数的输入。

我不知道是什么原因造成的,甚至不知道如何找出问题所在。我在代码本身的范围内看不到任何逻辑解释,所以这可能与内存有关?评论是当我在单个处理器上运行它时会发生什么,但是如果我在 2 个处理器上运行它(它是一个 mpi 代码)它似乎是在随机处理器上随机发生的(我没有包括所有细节这里是因为代码很长,但如果你觉得这里的信息不足以猜测出什么问题,我可以发布它)

谢谢

最佳答案

1071644672 具有与 1.75 相同的值表示(作为 32 位值)。

grid_locations[box_counter][5]=(k+1)*zgridlength;

正在覆盖属于 particles_celllist 的内存。可能 grid_locations[box_counter] 不够大,无法让 grid_locations[box_counter][5] 正确访问内存;尝试将其更改为 grid_locations[box_counter].at(5) 并查看它是否中断。

关于c++ - C++ STL 容器集的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012719/

相关文章:

c++ - 如何在迭代时从集合中删除相邻条目

c++ - CPP 底漆 5ed。 15.8.1 多重集相关

c++ - 成员函数特征

c++ - 为成对容器的第一个元素提供迭代器

c++ - 可以使用 std::vector 元素的地址作为指针吗?

c++ - 在 C++ 中将 begin() 和 end() 与集合一起使用

java - 迭代时修改集合 (Java)

c++ - 重载ostream&运算符<< : how to force outputting zeroes?

c++ - 尝试使用 std::add_const 将 T& 转换为 const T&

c++ - Purify 在使用 std::list::remove() 时揭示了潜在的空闲内存读取