我有一个结构,其中有一个向量
vector<int> accept;
在我的程序中,当我尝试在特定索引处插入值时。我收到这个错误:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check
在我的循环的每次迭代中,我递增AlphabetCounter并在该特定索引处放置一个值,如下面给出的代码:
AlphabetCounter=AlphabetCounter+1;
NewNextStateDouble.accept.at(AlphabetCounter)=1;
在开始循环之前,AlphabetCounter = -1。
我不明白为什么会出现超出范围的错误。
答案 0 :(得分:2)
您只能使用以下两种方法生成矢量:
使用resize()
方法:
std::vector<int> my_vector;
v1.resize( 5 );
使用push_back()
方法动态增加向量的大小:
std::vector<int> my_vector;
for( int i = 0; i != 10; ++i )
{
my_vector.push_back( i );
}
std::cout << "The vector size is: " << my_vector.size() << std::endl;
在您的情况下,您必须知道下标不会添加元素,正如标准所说:
vector(和string)上的下标运算符获取现有的 元件;它不会添加元素。
另外一些关于下标的建议可以在下面看到。
仅存在已知存在的元素!
理解我们可以使用下标运算符至关重要 (
[]
运算符)仅获取实际存在的元素。 (例如,请参阅下面的代码)下标不存在的元素是错误的,但是这是一个错误 编译器不太可能检测到。相反,我们在运行时获得的值是 未定义。 (通常是
out_of_range
例外)不幸的是,尝试下标不存在的元素是一个 非常常见且有害的编程错误。所谓的缓冲区 溢出错误是下标不存在的元素的结果。这样 错误是PC和其他安全问题的最常见原因 应用
vector<int> ivec; // empty vector
cout << ivec[0]; // error: ivec has no elements!
vector<int> ivec2(10); // vector with ten elements
cout << ivec2[10]; // error: ivec2 has elements 0 . . . 9
答案 1 :(得分:1)
如果要更改位置AlphabetCounter
的值,向量必须至少包含AlphabetCounter
+ 1个元素。在访问该值之前,您必须确保是这种情况。
答案 2 :(得分:1)
std::vector
不会增长到特定索引。如果您知道大小(需要在特定索引处插入),那么您应该resize()
向量到适当的大小。
答案 3 :(得分:1)
你创建了一个空矢量....使用accept.push_back(5)
....
Description of push_back() method
Adds a new element at the end of the vector, after its current last element.
The content of val is copied (or moved) to the new element.
This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size
surpasses the current vector capacity.