覆盖向量 C++
Posted
技术标签:
【中文标题】覆盖向量 C++【英文标题】:Overwriting Vectors C++ 【发布时间】:2011-11-22 14:32:17 【问题描述】:我试图将值覆盖到我的向量中:
for (i = 0; i < 50; i++)
LJ.clear();
LJ.reserve(210);
//Calculate Lennard-Jones potential of every pair
for(itr = 0; itr < 210; itr++)
term1 = pow(r[itr], 12);
term1 = 1/term1;
term2 = pow(r[itr], 6);
term2 = 2/term2;
LJ.push_back(term1 - term2);
//Calculate the initial Energy in the system Ei
Ei = accumulate(LJ.begin(), LJ.end(), 0.0);
Ei = Ei/2;
cout << Ei << endl;
但是,每当我遇到循环两次时,向量的容量都会得到一些垃圾值,当我尝试将一个项目推入时,我遇到了分段错误......如果我离开了我们的保留部分,我仍然有一个段错误
【问题讨论】:
您不需要在外循环的每次迭代中都使用reserve
,因为vec.clear()
被定义为vec.erase(vec.begin(), vec.end())
,这不会减少容量。另外,“每当我遇到循环两次”是什么意思?
向我们展示 r 及其人口的代码。
r
的定义是什么?
对我来说运行良好codepad.org/vXpHI0Ro
另外,如果 term2 曾经等于 0,你会得到一个除以 0 的结果,这很可能会崩溃
【参考方案1】:
但是,每当我遇到循环两次时,向量的容量都会得到一些垃圾值 [...]
这是内存损坏的明显迹象。
您可能在堆栈上有一个数组,并且您正在覆盖超过数组限制的堆栈,“踩到”向量的脚趾。无论哪个数组更接近LJ
声明,都可能是不幸写入的目标。
【讨论】:
【参考方案2】:如果r
也是std::vector
,请尝试将内部循环更改为以下内容:
// assuming r is a vector<double>
for(vector<double>::iterator it = r.begin(), ite = r.end(); it != ite; ++it)
// use *it instead of r[itr];
term1 = pow(*it, 12);
term1 = 1/term1;
term2 = pow(*it, 6);
term2 = 2/term2;
LJ.push_back(term1 - term2);
但是,如果r
是静态分配的数组(即在堆栈上),请将其更改为:
for(int itr = 0; itr < sizeof(r)/sizeof(r[0]); ++itr)
// same content...
如果这不是段错误,r
是 not 有 210 个元素。
【讨论】:
以上是关于覆盖向量 C++的主要内容,如果未能解决你的问题,请参考以下文章