今天我在VS2012和Max OS 10.7中尝试过类似的东西
vector<int> vec;
vector<int> vec2;
for(int i = 0;i < 100 ;i++){
vec.push_back(i);
}
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
cout << vec[127] << endl;
//vec2.reserve(10);
fill_n(vec.begin(),128,-1);
cout << vec[127] << endl;
return 0;
因为我们知道vector的大小是容器中元素的实际数量,上面的代码可能会导致VS2012中的运行时错误,但它在Max OS上工作正常,我在Ideone.com中尝试它也是运行成功,我不确定大小和容量的定义是否有问题,为什么我可以访问超出大小的元素?
PS:我的电脑在这种情况下的容量在VS2012上为141,在Mac OS和Ideone.com上为128
答案 0 :(得分:7)
std::vector
运算符[]
不会抛出任何超出范围的错误。使用[]
运算符访问大于矢量大小的元素是一种未定义的行为。
改为使用std::vector::at
,这会引发std::out_of_range
答案 1 :(得分:0)
碰到这个问题,我尝试详细说明@ P0W的答案。
如果有人想访问2d向量的元素,
应该执行以下操作并了解API 2dvector.at(row#).at(col#)
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector <vector<int> > vi;
vi.push_back( vector <int>() ); // add empty 1d vector
vi.at(0).push_back( 1 ); // push 1st element
cout << vi.at(0).at(0) << endl; // access element of 2d vector and prints 1
vi.at(0).at(0) = 2; // change number
cout << vi.at(0).at(0) << endl; // access element of 2d vector and prints 2
}
std::out_of_range
如果您找不到std::out_of_range
的示例,这里有一个
// out_of_range example
#include <iostream> // std::cerr
#include <stdexcept> // std::out_of_range
#include <vector> // std::vector
int main (void) {
std::vector<int> myvector(10);
try {
myvector.at(20)=100; // vector::at throws an out-of-range
}
catch (const std::out_of_range& oor) {
std::cerr << "Out of Range error: " << oor.what() << '\n';
}
return 0;
}
Out of Range error: vector::_M_range_check