2017-09-18 14 views
6

Giả sử, tôi muốn lặp lại một số cặp được xác định nội tuyến. Có cách viết ngắn hơn không:Dựa trên phạm vi cho danh sách ghép đôi

for(auto pair : std::initializer_list<std::pair<int,int>>{{1,2}, {3,4}}) 
    // ... 

?

+0

Bạn có thể bí danh kiểu :) – StoryTeller

+0

@StoryTeller Đó không phải là ngắn, phải không? – IceFire

+0

Biểu thức vòng lặp ngắn hơn. Mà sẽ làm giảm đáng kể công cụ nếu bạn làm điều này looping nhiều hơn một lần. – StoryTeller

Trả lời

8

Chỉ định phần tử đầu tiên là một cặp. Phần còn lại sẽ được suy luận tự động:

for(auto& pair : {std::pair<int,int>{1,2}, {3,4}}) 
    ; 

các initializer kèm chuẩn bị tinh thần là suy luận được std::initalizer_list, và các yếu tố đầu tiên được đặt tên một cặp sẽ yêu cầu tất cả yếu tố để trở thành một initalizer cho một cặp.

Bạn tagged C++ 11, nhưng cho đầy đủ, nó có thể thậm chí ngắn hơn trong C++ 17:

for(auto& pair : {std::pair{1,2}, {3,4}}) 
    ; 

Do lớp trích mẫu tranh cãi. Nếu bạn không có điều đó, hơn std::make_pair sẽ làm gì nếu bạn muốn duy trì những lợi ích của trích mẫu đối số:

for(auto& pair : {std::make_pair(1,2), {3,4}}) 
    ; 

Mặc dù bề ngoài, nó không phải là hữu ích cho mã chơi golf như các phiên bản C++ 17 .

+0

Tốt nhất, cảm ơn :) Dựa trên câu trả lời của bạn, tôi cũng tìm thấy phiên bản này hoạt động bên dưới C++ 17: 'cho (cặp tự động: {std :: make_pair (1,2), {3,4}, {5,6}})' – IceFire

+0

@IceFire - Vâng, nó cũng hoạt động trong C++ 11. Việc khấu trừ đối số có thể thay thế 'make_pair' trong C++ 17 tuy nhiên. – StoryTeller

+0

Vâng, tôi thích điều này nhất. Trình biên dịch của tôi không chấp nhận nó cho đến nay, mặc dù. Dù sao, chúng tôi dường như đã bao gồm tất cả các tùy chọn – IceFire

1

Các tốt ol' loại bí danh:

using pairlist = std::initializer_list<std::pair<int,int>>; 

for(auto pair : pairlist{{1,2}, {3,4}}) 
{ 
    // stuff happens here 
} 
+0

điều này thực sự dài hơn – IceFire

+0

@IceFire Không trung bình trên nhiều vòng lặp. – Galik

+0

Tôi đã không nói gì về nhiều vòng lặp. Trong thực tế, muốn đặt nội tuyến danh sách này là một chỉ báo rõ ràng rằng tôi chỉ có một ví dụ vòng lặp – IceFire

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