为什么矢量下标超出范围?

问题描述

我正在尝试编写这个非常简单的加法程序进行练习。

它接受输入列表并将其存储在向量中。然后,它从向量中抓取每个连续的元素并将其求和。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> i;

    int input;
    int sum = 0;
    int y = 0;

    while (std::cin >> input && input != 0000) {
        i.push_back(input);

    }

    for (y; y < sizeof(i); y++) {

        sum = sum + i[y];
    }
    std::cout << sum;
}

但是,当我编译并运行程序时,它可以正常工作,直到for循环开始运行,然后编译器停止并吐出向量下标超出范围的消息?

我做错了什么?

解决方法

如果要遍历向量,则需要使用i.size()检查它具有多少个元素:

for (y; y < i.size(); y++) 
{
    sum = sum + i[y];
}

这是基于范围的for循环的典型用例:

for(const auto& elem : i)
    sum += elem;

或者最好还是使用STL算法:

#include <numeric>

sum = std::accumulate(i.begin(),i.end(),sum);

使用sizeof为您提供向量的编译时大小,该向量仅指看家的东西,例如其大小,容量和数据指针,而不是数据本身。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...