覆盖向量 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...

如果这不是段错误,rnot 有 210 个元素。

【讨论】:

以上是关于覆盖向量 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ 覆盖方法

c++:向量问题的向量

C++:遍历向量的向量

向量c++的向量大小

C++中向量的向量顺序

(向量对)与(向量对)C++的速度[关闭]