我是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;
}
答案 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;
}
注意:这仅适用于在迭代时更改向量中元素的数量,如本例所示。如果在迭代期间添加或删除元素,则可能会使迭代器失效。