Can a functor provide std :: generate be stateful?

I recently read that some STL algorithms have undefined behavior if the passed functor has a state (has internal side effects). I used a function std::generatewith a similar functor (less trivial):

class Gen
{
public:
    explicit Gen(int start = 0)
        : next(start)
    {
    }

    int operator() ()
    {
        return next++;
    }

private:
    int next;
};

Is it safe to use with std::generate? Is the order of generating values ​​guaranteed?

Edit: Claim made here Functional Functions and STL: undefined behavior

+4
source share
3 answers

Introduction

stateful , std:: generate, , , , , , .

25.1p10 - [algorithms.general]

[. , , , obejcts. , imoprtant, -, , reference_wrapper - . - ]


/

, last - first (N) , . Q & A:


+ std::generate, ?

, , .

std:: generate , , std:: generate, , , , , , .

. , :

#include <iostream>
#include <algorithm>

template<class id_type>
struct id_generator {
  id_type operator() () {
    return ++idx;
  }

  id_type next_id () const {
    return idx + 1;
  }

  id_type idx {};
};

int main () {
  id_generator<int> gen;

  std::vector<int>  vec1 (5);
  std::vector<int>  vec2 (5);

  std::generate (vec1.begin (), vec1.end (), gen);
  std::generate (vec2.begin (), vec2.end (), gen);

  std::cout << gen.next_id () << std::endl; // will print '1'
}

, gen.next_id () 11, 5 vec1 5 vec2.

, std:: generate id_generator , , .


?

, , std:: .


# 1

- std::reference_wrapper std::ref <functional>. reference_wrapper, generate_id .

std::generate (vec1.begin (), vec1.end (), std::ref (gen));
std::generate (vec2.begin (), vec2.end (), std::ref (gen));

std::cout << gen.next_id () << std::endl; // will print '11'


№ 2

, , , - , :

std::generate<decltype(vec1.begin()), id_generator<int>&>(vec1.begin(), vec1.end(), gen);
+5

. : . , . , :

template <typename T>
struct constant {
    constant(T&& value) : value{value} {}

    T const& operator ()() const { return value; }

private:
    T const value;
};

, , , , std::random_device. . . - .

, , not, , - , ( , bool).

+5

, . . , . ( , .)

, , , generate accumulate, . ; , , generate . , , , , , , , , .

0
source

Source: https://habr.com/ru/post/1543841/


All Articles