我尝试使用否定索引为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
,因此编译器应执行{的隐式转换{1}}(int
变量的类型)到index
。由于上例中的unsigned int
值为index
,因此隐式转换后的-1
为index
(即4294967295
类型的最大值): value传递给unsigned int
成员函数,该函数抛出vector::at()
异常。
换句话说,不抛出此异常,因为out_of_range
成员函数看到vector::at()
小于零,而是因为隐式转换的index
大于当前index
的大小。这是正确的解释吗?
答案 0 :(得分:10)
是的,这是一个正确的解释。 (at
除外vector::size_type
,通常是std::size_t
,这是一些未指定的无符号整数类型(通常是系统上指针的位宽)。它是unsigned int
您的系统是允许的,但不是标准规定的; 32位unsigned int
和64位size_t
是常见的。)
顺便说一句,请注意无符号签名转换:标准不要求它是往返签名 - &gt; unsigned-&gt;签署负值,而某些编译器积极以意想不到的方式进行优化。