2011-07-08 17 views
6

Chức năng mẫu iota đã được thêm vào thư viện chuẩn để điền vào một phạm vi trình lặp với một chuỗi các giá trị ngày càng tăng.Tại sao họ không thêm phiên bản nhà khai thác của iota?

template<typename ForwardIterator, typename Tp> 
    void 
    iota(ForwardIterator first, ForwardIterator last, Tp value) 
    { 
     for (; first != last; ++first) 
     { 
      *first = value; 
      ++value; 
     } 
    } 

Hầu hết các mẫu khác trong số <numeric> đều có phiên bản chấp nhận nhà khai thác do người dùng chỉ định. Có điều này:

template<typename ForwardIterator, typename Tp, typename Operator> 
    void 
    iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op) 
    { 
     for (; first != last; ++first) 
     { 
      *first = value; 
      op(value); 
     } 
    } 

sẽ thuận tiện nếu bạn không muốn (hoặc không thể) quá tải toán tử ++() cho Tp. Tôi sẽ tìm thấy phiên bản này rộng rãi hơn có thể sử dụng hơn so với phiên bản mặc định toán tử ++(). <

+0

Bạn nói đúng, với lambdas phiên bản thứ hai không chỉ linh hoạt hơn phiên bản đầu tiên mà hầu như dễ sử dụng để tăng thêm. –

Trả lời

4

Với lambdas, phiên bản thứ hai không tiết kiệm được nhiều, bạn chỉ có thể sử dụng std::generate.

template<typename ForwardIterator, typename Tp, typename Operator> 
void iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op) 
{ 
    std::generate(first, last, [&value,&op](){auto v = value; op(value); return v;}); 
} 

Trong thực tế, điều này làm cho việc thực hiện hiện tại của std::iota rất dư thừa:

template<typename ForwardIterator, typename Tp> 
void iota(ForwardIterator first, ForwardIterator last, Tp value) 
{ 
    std::generate(first, last, [&value](){return value++;}); 
} 
+0

Đúng, iota có thể chỉ ban phước cho phiên bản SGI được phân phối bởi gcc dưới dạng phần mở rộng và có thể là các triển khai khác. – emsr

+1

'partial_sum' thậm chí còn tốt hơn (không có' [&] '). 'vector i (10,0); partial_sum (i.begin(), i.end(), i.begin(), [] (int p, int c) {return p ++;} ' –

+0

@kirill: Gần như vậy. Nhưng' partial_sum' không chấp nhận một tham số 'value' để gộp phần tích lũy. Ngoài ra, dấu ngoặc kép' ++' trong đoạn mã của bạn là vô ích ... giá trị được cập nhật của 'p' bị loại bỏ ngay lập tức. Trên thực tế, đoạn mã của bạn hoàn toàn sai, và doesn ' t tạo ra một chuỗi ngày càng tăng ở tất cả –

5

tôi nghi ngờ lý do là sự pha trộn thông thường của một hoặc nhiều trong những lý do sau đây:

  • Không ai đã gửi đề xuất
  • Nó không được coi là đủ quan trọng cho này phiên bản (mà là đã khổng lồ, và rất muộn)
  • nó giảm qua các vết nứt và đã bị lãng quên (như copy_if trong C++ 98)
  • nó rất dễ dàng để thay thế sử dụng std::generate.
Các vấn đề liên quan