使用负索引索引std :: vector

时间:2013-03-02 14:33:24

标签: c++ type-conversion implicit-conversion

我尝试使用否定索引为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,因此隐式转换后的-1index(即4294967295类型的最大值): value传递给unsigned int成员函数,该函数抛出vector::at()异常。

换句话说,不抛出此异常,因为out_of_range成员函数看到vector::at()小于零,而是因为隐式转换的index大于当前index的大小。这是正确的解释吗?

1 个答案:

答案 0 :(得分:10)

是的,这是一个正确的解释。 (at除外vector::size_type,通常是std::size_t,这是一些未指定的无符号整数类型(通常是系统上指针的位宽)。它是unsigned int您的系统是允许的,但不是标准规定的; 32位unsigned int和64位size_t是常见的。)

顺便说一句,请注意无符号签名转换:标准不要求它是往返签名 - &gt; unsigned-&gt;签署负值,而某些编译器积极以意想不到的方式进行优化。