矢量下标超出范围错误?

时间:2015-02-23 01:33:18

标签: c++

我是c ++编程的新手,当我运行它时,它成功编译并输出数组的元素,但是我得到一个错误,上面写着“向量下标超出范围”。这段代码有什么问题?我看了一些其他的问题,似乎没有其他任何人有类似的矢量例子。

#include <iostream>
#include <vector>
#include <random>
#include <time.h>

using namespace std;

int main() {
srand(time(NULL));
    int arraysize;
cout << "Enter the size of your array:" << endl;
cin >> arraysize;
vector<int> numbers(arraysize);
vector<int>::size_type sizecheck = numbers.size();

cout << "This is the unsorted array:" << endl;
for (int z = 0; numbers[z] < sizecheck; z++)
{
    numbers[z] = rand() % 10 + 1;
    cout << numbers[z] << endl;
}

return 0;
}

2 个答案:

答案 0 :(得分:2)

但是,给定无限内存的代码实际上是一个无限循环,因为为向量分配了有限的内存量,它会表现出未定义的行为。 numbers将初始化值(将每个元素设置为0),这意味着条件始终为0 < sizecheck。一旦z达到向量中的元素数量,就会超出数组边界并进入未定义的行为域。

您的IDE或您正在使用的任何内容已经发现错误,但您可以使用更安全的变体at()而不是operator[]。这将抛出异常并提供有用的信息。例如:

for (int z = 0; numbers.at(z) < sizecheck; z++)
{
    numbers.at(z) = rand() % 10 + 1;
    cout << z << " " << numbers.at(z) << endl;
}

0 2
1 8
2 10
3 9
4 8
5 2
6 3
7 4
8 4
9 2

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 10) >= this->size() (which is 10)

正如评论中所述,您可能要做的是z < sizecheck,但为了安全起见,您应该z类型std::vector<int>::size_type

答案 1 :(得分:0)

@remyabel已经给出了绝对正确的答案,但除此之外,在循环使用iterator等标准组件时,您应该考虑使用vector而不是索引for循环。

e.g。

vector<int>::iterator it;
for(it = numbers.begin(); it != numbers.end(); ++it)
{
    *it = rand() % 10 + 1;
    cout << *it << endl;
}

注意:这仅适用于在迭代时更改向量中元素的数量,如本例所示。如果在迭代期间添加或删除元素,则可能会使迭代器失效。