2013-03-02 96 views
9

我试图使用负向索引来索引vector。所述vector::at()成员函数检查指定索引是否是向量的边界内,并且如果这种情况不会发生,一个out_of_range则抛出异常。索引负向索引的std ::向量

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,隐式转换的index4294967295(即unsigned int类型的最大值):该值传递给vector::at()成员函数,该成员函数抛出out_of_range异常。

换句话说,没有引发这种异常,因为vector::at()成员函数看到该index小于零,而是由于隐式转换indexvector的当前大小越大。这是一个正确的解释吗?

+0

是的,基本上。 – Dave 2013-03-02 14:35:40

+0

是的,这是正确的解释。 – syam 2013-03-02 14:35:43

回答

8

是的,这是一个正确的解释。 (除了at需要vector::size_type,通常是std::size_t,这是一些未指定的无符号整数类型(通常是系统中指针的位宽)。您的系统上允许使用unsigned int,但不是由标准强制; 32位unsigned int与64位size_t共同地)

顺便说一句,小心无符号到符号转换:标准不要求它是一个往返持续人士签署> unsigned->签订了负值,和一些编译器积极以意想不到的方式进行优化。

+0

这是什么意思_标准并不要求它是负值的倒数_? – enzom83 2013-03-02 14:58:48

+4

'(int)(unsigned)-1 == -1'不一定是真的。 – Yakk 2013-03-02 17:09:45

+0

“某些编译器会以意想不到的方式进行积极优化” - 此转换是*实现定义的*因此不应该有任何优化意外 – 2016-05-06 13:47:34