我试图索引一个vector
使用负索引。这vector::at()
成员函数检查指定的索引是否在向量的范围内,如果没有发生,则返回一个out_of_range
抛出异常。
vector<float> array; // sample vector
array.push_back(0.123);
array.push_back(1.234);
array.push_back(2.345);
array.push_back(3.456);
array.push_back(4.567);
int index = -1;
float f = array.at(index);
cout << f << endl;
的签名vector::at()
成员函数要求指定参数为vector<T>::size_type
类型,这个类型是unsigned int
对于向量,因此编译器应该执行隐式转换int
(的类型index
变量)到unsigned int
。自从index
值为-1
在上面的例子中,隐式转换的index
is 4294967295
(即最大值unsigned int
类型):该值被传递给vector::at()
成员函数,它抛出一个out_of_range
例外。
换句话说,不会抛出此异常,因为vector::at()
成员函数看到index
小于零,而是因为隐式转换index
大于当前大小vector
。这是正确的解释吗?
是的,这是一个正确的解释。 (除了at
需要一个vector::size_type
, 通常std::size_t
,这是一些未指定的无符号整数类型(通常是系统上指针的位宽)。它是unsigned int
在您的系统上是允许的,但标准不强制要求; 32位unsigned int
64 位size_t
常见。)
顺便说一句,要小心无符号到有符号的转换:标准不要求它是负值的有符号->无符号->有符号的往返,并且某些编译器积极地以意想不到的方式进行优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)