2012-03-27 39 views
8

Với việc sử dụng sau đây của auto:C++ 11 ô tô và size_type

std::vector<int> v; 
for (auto i = 0; i < v.size(); ++i) { 
    ... 
} 

Nó sẽ là lý tưởng cho C++ để suy luận i như std::vector<int>::size_type, nhưng nếu nó chỉ nhìn vào initializer cho i, nó sẽ thấy một số nguyên. Loại suy luận của i trong trường hợp này là gì? Đây có phải là cách sử dụng thích hợp của auto không?

+0

Không biết bạn làm gì với 'i' không thể nói được. –

+0

Tôi không bao giờ biết rằng 'auto' được sử dụng để suy ra loại biến thích hợp! Phải không? –

+3

@ Mr.TAMER Vâng, họ đã thay đổi ý nghĩa của nó trong C++ 11. –

Trả lời

20

Sử dụng decltype thay vì auto để khai báo i.

for(decltype(v.size()) i = 0; i < v.size(); ++i) { 
    // ... 
} 

Thậm chí tốt hơn, sử dụng trình vòng lặp để lặp qua véc tơ như chương trình trả lời của @ MarkB.

+3

Hoặc thậm chí tốt hơn, sử dụng phạm vi dựa trên vòng lặp, như trong câu trả lời dưới đây. – juanchopanza

13

Tại sao không giải quyết được sự cố của bạn với trình lặp? Sau đó, vấn đề sẽ biến mất:

std::vector<int> v; 
for (auto i = v.begin(); i != v.end(); ++i) { 
    ... 
} 

Nếu bạn muốn lặp lại bằng cách sử dụng các chỉ mục, tôi có thể chỉ định rõ ràng loại: Bạn biết đó là gì. auto chủ yếu được sử dụng cho các loại mẫu không xác định hoặc khó loại mà tôi tin.

+1

nó sẽ bắt đầu (v) và kết thúc (v) – Klaim

3

auto lấy loại độc quyền từ bộ khởi tạo. Không chú ý đến việc sử dụng khác, ít nhất là không để xác định loại biến. Đi mà vào tài khoản là tốt, decltype là một lựa chọn:

for (decltype(v.size()) i = 0; i < v.size(); ++i) 

hay, bạn có thể viết lại lặp đi ngược:

for (auto i = v.size(); i-- != 0;) 

hay, bạn có thể tránh được for vòng lặp hoàn toàn.

7

Câu trả lời cho câu hỏi của bạn "Đây có phải là cách sử dụng ô tô thích hợp không?" không vì lý do nào được giải thích trong các câu trả lời khác. Đối với trường hợp cụ thể của vòng lặp thông qua các nội dung của một container, bạn có nhiều khả năng tốt hơn hết với một loạt dựa cho vòng lặp:

const tham khảo truy cập đến các yếu tố, iconst int&:

std::vector<int> v; 
for (const auto& i : v) { 
    std::cout << i << "\n"; 
} 

phi truy cập tham chiếu const, iint&:

std::vector<int> v; 
for (auto& i : v) { 
    ++i; 
    std::cout << i << "\n"; 
} 

truy cập giá trị, iint:

0.123.
std::vector<int> v; 
for (auto i : v) { 
    ... 
} 

v.v. Điều này cũng làm việc cho các mảng kiểu C.

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