Logicky Blog

Logickyの開発ブログです

c++23で順列を扱う

c++23 にする

下記で c++23 でコンパイルできる。

g++ -std=c++23 hoge.cpp -o hoge.out

vscode のコンパイルするタスクも下記で c++23 でコンパイルできる。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "c++ build for AtCoder",
      "type": "shell",
      "command": "g++",
      "args": [
        "-g",
        "-O0",
        "-std=c++23",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.out"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

VSCode の C/C++拡張機能は、デフォルトで C++17 までの機能をサポートしているらしく、c++20 以上を利用する際にエディタでエラーが出る場合がある。.vscode/c_cpp_properties.jsonに下記を設定することで、拡張機能の c++バージョンを変更できるらしい。(実際エラー消えた)

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": ["${workspaceFolder}/**"],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c17",
            "cppStandard": "c++23",
            "intelliSenseMode": "gcc-x64",
            "compilerArgs": ["-std=c++23"]
        }
    ],
    "version": 4
}

順列

ranges::next_permutation(hoge)を使うと、引数 hoge の vector に対する、順列のパターンの次を出してくれる。[0,1,2]を入れると、[0,2,1]を返す。[0,2,1]を入れると[1,0,2]を返す。多分。要するに、全パターンを順番に取得する場合は、しっかりと昇順にソートしてから渡す必要がある。iota(hoge.begin(), hoge.end(), 0)は、hoge の最初から最後までを 0 から始まる連続する数値で埋める関数。

#include <bits/stdc++.h>

using namespace std;

int main()
{
  vector<int> cells(3);
  iota(cells.begin(), cells.end(), 0);
  do
  {
    for (auto &&c : cells)
    {
      cout << c;
    }
    cout << endl;
  } while (ranges::next_permutation(cells).found);
}

上記の実行結果は下記になる。

012
021
102
120
201
210