2013-02-05 36 views
5

Tôi được dạy string::at trong trường học, nhưng bằng cách khám phá thư viện chuỗi tôi thấy string::operator[], mà tôi chưa bao giờ được hiển thị trước đây.Sự khác biệt giữa string :: at và string :: operator [] là gì?

Tôi hiện đang sử dụng operator[] và chưa sử dụng at từ đó, nhưng điểm khác biệt là gì? Dưới đây là một số mẫu mã:

std::string foo = "my redundant string has some text"; 
std::cout << foo[5]; 
std::cout << foo.at(5); 

Họ là về cơ bản giống về đầu ra, nhưng có một số khác biệt tinh tế tôi không biết?

+3

Bạn hãy thử một tham chiếu cho mỗi? Có một sự khác biệt, mà sẽ khá dễ dàng để phát hiện khi so sánh tài liệu tham khảo. – chris

+1

Chờ, bạn đã quyết định chuyển từ '.at()' sang 'toán tử []' * trước khi * xem xét một cuốn sách hoặc tham chiếu trực tuyến? – us2012

+0

, tôi đọc toán tử [] nhanh hơn, nhưng không biết tại sao ... –

Trả lời

15

Vâng, có một sự khác biệt lớn: sử dụng .at() sẽ kiểm tra phạm vi trên chỉ số thông qua và ném một ngoại lệ nếu nó so với cuối của chuỗi khi operator[] chỉ mang hành vi undefined trong tình huống đó.

10

atkiểm tra giới hạn, ngoại trừ loại std::out_of_range sẽ bị ném khi truy cập không hợp lệ.

operator[]KHÔNG kiểm tra giới hạn và do đó có thể nguy hiểm nếu bạn cố gắng truy cập vượt quá giới hạn của chuỗi. Nó nhanh hơn một chút so với at.

4

std :: string :: tại

Trả về một tham chiếu đến các nhân vật tại địa điểm quy định pos. Kiểm tra giới hạn được thực hiện, ngoại trừ loại std :: out_of_range sẽ bị ném khi truy cập không hợp lệ.

chuỗi :: operator []

Trả về một tham chiếu đến các nhân vật tại địa điểm quy định pos. Không kiểm tra giới hạn được thực hiện. Đó là hành vi không xác định để truy cập ngoài ranh giới với operator[].

string::operator[] nên silghtly nhanh hơn std::string::at

thấy reference

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