2013-03-02 27 views
9

Tôi đã cố gắng lập chỉ mục một số vector sử dụng chỉ mục phủ định. Hàm thành viên vector::at() kiểm tra xem chỉ mục được chỉ định nằm trong giới hạn của vectơ và nếu điều này không xảy ra, ngoại lệ out_of_range sẽ được ném.Lập chỉ mục một tiêu chuẩn :: vectơ với chỉ số âm

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; 

Chữ ký của vector::at() chức năng thành viên yêu cầu các tham số chỉ định của vector<T>::size_type loại, và loại này là unsigned int cho vector, do đó trình biên dịch sẽ thực hiện một chuyển đổi ngầm từ int (kiểu của biến index) đến unsigned int. Vì giá trị index-1 trong ví dụ trên, được chuyển đổi hoàn toàn index4294967295 (đó là giá trị tối đa của loại unsigned int): giá trị này được chuyển đến vector::at() chức năng thành viên, có ngoại lệ out_of_range.

Nói cách khác, ngoại lệ này không được ném bởi vì chức năng vector::at() thành viên thấy rằng index là nhỏ hơn không, nhưng thay vì chuyển đổi ngầm index lớn hơn kích thước hiện tại của vector. Đây có phải là lời giải thích đúng không?

+0

Có, về cơ bản. – Dave

+0

Vâng, đó là giải thích đúng. – syam

Trả lời

8

Vâng, đó là một sự khám phá chính xác. (Trừ at có một số vector::size_type, thường là std::size_t, là một số loại số nguyên không dấu không xác định (thường là chiều rộng bit của con trỏ trên hệ thống của bạn), được phép là unsigned int trên hệ thống của bạn, nhưng không được bắt buộc theo tiêu chuẩn; 32 bit unsigned int 64 bit size_t là phổ biến.)

Là một sang một bên, hãy cẩn thận với unsigned để chuyển đổi đã ký: tiêu chuẩn không yêu cầu nó là một chuyến đi khứ hồi ký-> unsigned-> ký cho giá trị âm, và một số trình biên dịch tích cực tối ưu hóa theo những cách không mong muốn.

+0

Điều đó có nghĩa là tiêu chuẩn nào không yêu cầu nó là nghịch đảo đối với các giá trị âm_? – enzom83

+4

'(int) (unsigned) -1 == -1' không cần đúng. – Yakk

+0

"một số trình biên dịch tích cực tối ưu hóa theo những cách không mong muốn" - chuyển đổi này là * triển khai thực hiện * vì vậy không nên có bất kỳ sự ngạc nhiên tối ưu hóa –

Các vấn đề liên quan