Với C++ 11, STL hiện có chức năng std::iota
(xem reference). Ngược lại với std::fill_n
, std::generate_n
, tuy nhiên, không có std::iota_n
. Điều gì sẽ là một thực hiện tốt cho điều đó? Vòng lặp trực tiếp (phương án 1) hoặc ủy quyền cho std::generate_n
với biểu thức lambda đơn giản (phương án 2)?Điều gì sẽ là một triển khai tốt của iota_n (thiếu thuật toán từ STL)
Alternative 1)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
while (n--)
*first++ = value++;
return first;
}
Alternative 2)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
return std::generate_n(first, n, [&](){ return value++; });
}
có cả hai lựa chọn thay thế tạo ra mã tương đương với việc tối ưu hóa trình biên dịch?
CẬP NHẬT: kết hợp điểm tuyệt vời của @Marc Mutz cũng trả lại trình lặp tại điểm đích của nó. Đây cũng là cách std::generate_n
được cập nhật trong C++ 11 so với C++ 98.
Tôi nghĩ rằng câu hỏi này tập trung vào một cái gì đó quá cụ thể cho một cái gì đó tổng quát hơn: các cấu trúc vòng lặp khác nhau. –
Tại sao bạn không thử nó và so sánh lắp ráp? –
@KerrekSB Không phải là một chuyên gia về sản lượng lắp ráp grokking. Tôi quan tâm đến việc nghe từ những người có chuyên môn như vậy nếu STL oneliners với lambdas thường sẽ được tối ưu hóa cho các vòng thẳng. Nếu đúng như vậy, đây sẽ là một động cơ lớn hơn để viết nhiều biến thể hơn về các thuật toán STL, hơn là suy nghĩ kỹ về các vòng phức tạp. – TemplateRex