读取整数到向量时超出内存限制

时间:2013-09-01 07:05:55

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

我正在尝试将文本文件中的整数值读入矢量。

输入文件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&lt; ip1.txt *

4 个答案:

答案 0 :(得分:1)

源代码中的错误。 maxsub()

中的所有循环
for(vector<int>::iterator w=a.begin(); w <= a.begin()+size-1; ++w)
for(int t=0; t <= size-1; t++)

具有从0到大小为1的元素的迭代(=所有元素中的大小),但是在代码

之后
a.erase(a.begin());

vector'a'只有(size-1)个元素。 因此,所有的运营商都是“边界之外”。 我想,这是警告信息的原因。

答案 1 :(得分:0)

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

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 <iostream>#include <sstream>#include <vector>。另请注意,std::cin可以轻松替换为文件流:)

答案 2 :(得分:0)

写一个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);
}

答案 3 :(得分:0)

'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);
}