【问题标题】:Memory Limit Exceeded while reading integers into the vector将整数读入向量时超出内存限制
【发布时间】:2013-09-01 07:05:55
【问题描述】:

我正在尝试将文本文件中的整数值读取到向量中。

输入文件ip1.txt有以下内容:

4

-1000 -2000 -3000 -4000

int maxsub(vector<int> a, int size)
{
    a.erase(a.begin());
    vector<int> sum;
    for(vector<int>::iterator w=a.begin(); w <= a.begin()+size-1; ++w)
    {
        int j;
        int s=*w;
        for(int t=0; t <= size-1; t++)
        {
            j = s + a[t];
            sum.push_back(j);
        }
        a.pop_back();
    }
    std::sort(sum.begin(),sum.end());

    int u = sum.size()-1;
    int m = sum.at(u);
    return m;
}


int main()
{
    std::vector<int> nums( (std::istream_iterator<int>(std::cin)),
                            std::istream_iterator<int>() );
    int k = nums[0];
    int u = maxsub(nums,k);
    cout << u <<endl;
}

我收到“超出内存限制”的警告消息

如何限制向量在输入文件中只读到 -4000,我正在使用文件重定向 *./123

【问题讨论】:

  • 我会使用 forwhile 循环一次读取一个元素,直到标记值 -4000 ....
  • 文件有多大?在我看来您的代码有错误,我想知道错误是由这些错误之一引起的,而不是文件的大小。
  • 如果可以w &lt; a.begin()+size,为什么要w &lt;= a.begin()+size-1
  • 为什么int u = sum.size()-1; int m = sum.at(u); return m; 可以做到return sum.back();

标签: c++ string parsing file-io vector


【解决方案1】:

源代码中的错误。 maxsub() 中的所有循环

for(vector<int>::iterator w=a.begin(); w <= a.begin()+size-1; ++w)
for(int t=0; t <= size-1; t++)

有从 0 到 size-1 个元素的迭代(=所有元素中的全部大小),但在代码之后

a.erase(a.begin());

vector 'a' 只有 (size-1) 个元素。 因此,所有的 for 运算符都是“边界外的”。 我认为,这是警告消息的原因。

【讨论】:

    【解决方案2】:

    如果您知道第一个数字将是向量的长度,为什么不利用它呢?:

    int length = 0;
    std::cin >> length;
    
    std::vector<int> numbers;
    numbers.reserve(length);
    

    那么您可以使用简单的for 循环来检查数字是否已成功从流中提取,并防止读取超过特定数量的数字:

    int number;
    for (int i = 0; (i < length) && (std::cin >> number); ++i)
    {
        numbers.push_back(number);
    }
    

    别忘了#include &lt;iostream&gt;#include &lt;sstream&gt;#include &lt;vector&gt;。另请注意,std::cin 可以轻松替换为文件流:)

    【讨论】:

      【解决方案3】:

      写一个for循环

      std::vector<int> nums;
      int size;
      std::cin >> size;
      for (int i = 0; i < size; ++i)
      {
          int val;
          std::cin >> val;
          nums.push_back(val);
      }
      

      【讨论】:

        【解决方案4】:

        'a.begin()+size-1' 在 begin() 之前:

        拥有

        for(vector<int>::iterator w=a.begin(); w <= a.begin()+size-1; ++w)
        

        int k = nums[0];
        int u = maxsub(nums,k);
        

        nums[0] = -1000;
        

        大小为-1000

        如果要排除第一个和最后一个元素:

        if( ! a.empty()) {
            // Not erasing the first element: a.erase(a.begin());
            for(vector<int>::size_type i = 1;  i < a.size() - 1; ++i);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          • 2021-09-03
          • 2012-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多