c++ - 读取 vector 时出现段错误

标签 c++ stl

在 C++ 程序中,当我想读取大小为 2697806 的 vector 时,总是会出现 Segmentation fault 错误。 我已经尝试了所有可能的阅读方式:

void AUROC(vector<float> v) {
   ...
   for(std::vector<int>::size_type i = 0; i != v.size(); i++)
      if (v[i]>0) ++pos; else ++neg;

   for(std::vector<long>::size_type i = 0; i != v.size(); i++)
     if (v[i]>0) ++pos; else ++neg;

   for (vector<float>::iterator i=v.begin(); i!=v.end(); ++i)
     if (*i>0) ++pos; else ++neg;

   for (long i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;

   for(int i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;
}

...
int main(void) { 
    vector<float> scores;
    // put data in scores;
    AUROC(scores);
}

这个问题永远不会发生在尺寸小得多的 vector 上。

感谢您的帮助。 最好, 佩嘉

最佳答案

我知道您已经接受了答案,但是您发布的代码在以下循环中存在问题:

for(int i=0;i<=v.size();i++)

vector 索引是从零开始的。如果 vector 大小为 5,则有效索引为 0..4。您的代码将尝试访问元素 0..5,这是一个差一错误。我相信您对堆栈大小的“修复”只是掩盖了其他实际问题。

此外,您应该按引用而不是按值传递 vector 。当您调用 AUROC(vector<float> v) 时,您当前正在复制 vector .这很慢,而且是对内存的极大浪费。将函数改为AUROC(vector<float> &v) .

关于c++ - 读取 vector 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475448/

相关文章:

c++ - 在 C++ 模板中禁用代码的示例

c++ - 读取二进制数据寻找十六进制序列

c++ - "invalid use of incomplete type"部分模板特化错误

c++ - std::map<k,v> 的集合必须有多大才能超过排序的 std::vector<std::pair<k,v>>?

c++ - std::set 中打印的垃圾值

C++结构对象调用一个函数

c++ - printf() 混淆 - 尝试打印字符串时打印 (null) 并在打印缓冲区时打印正确的值

c++ - 在迭代 vector 时附加到 vector ?

c++ - 对容器中所有元素的成员函数结果求和的最佳方法是什么?

c++ - 是否有用于从另一个不同的 std::array 初始化 std::array 的特定语法?