-1

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

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

4

4 回答 4

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());

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

于 2013-09-01T07:36:23.017 回答
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

于 2013-09-01T07:25:07.750 回答
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);
}
于 2013-09-01T07:25:48.533 回答
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);
}
于 2013-09-01T07:28:28.343 回答