Кто в курсе, можете рассказать, как работает next_permutation в С++? Зачем этой функции нужны два итератора? Где она хранит состояние между вызовами. Сейчас пилил just for fun такую штуку на шарпе и стало интересно.
Ну так скачайте исходники gcc и найдите там как реализовано, в отличии от всяких там непосредственно кодов компилятора, исходные коды STL библиотеки, в реализации от GCC читаются легко, непренуждённо и увлекатльно.
p.s. кодю на C++ уже как 3-й год наверное, в т.ч. по основной работе, активно юзаю STL, а о такой штуке как next_permutation даже и не слышал :)
Почему ему не хватает только ссылки на последовательность?
Две причины:
Итераторы в С++ (по крайней мере стандартные) не знают о «размере» контейнера (они могут только перемещаться по контейнеру без проверки границ).
Весь STL спроектирован на итераторах, чтоб можно было проводить операции и на части контейнера. А понятие «range» появится в STL только в С++20.
Как он тогда узнаёт, что текущая перестановка уже была и нужно вычислить новую?
std::next_permutation делает лексикографическую перестановку (согласно operator < или соотвентствующего компаратора). Т.е. состояние перестановки == порядок значений последовательности.