algo

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub kuhaku-space/algo

:heavy_check_mark: flip set (lib/data_structure/flip_set.hpp)

Verified with

Code

#pragma once
#include <set>
#include <utility>

/// @brief flip set
template <class T>
struct flip_set {
    flip_set() : data() {}

    const auto begin() const { return data.begin(); }
    auto begin() { return data.begin(); }
    const auto end() const { return data.end(); }
    auto end() { return data.end(); }

    bool empty() const { return data.empty(); }
    int size() const { return data.size(); }

    bool contains(const T &x) const { return data.count(x); }
    bool contains(T &&x) const { return data.count(std::move(x)); }

    bool flip(const T &x) {
        if (data.count(x)) return data.erase(x), false;
        else return data.emplace(x), true;
    }
    bool flip(T &&x) {
        if (data.count(x)) return data.erase(std::move(x)), false;
        else return data.emplace(x), true;
    }

  private:
    std::set<T> data;
};
#line 2 "lib/data_structure/flip_set.hpp"
#include <set>
#include <utility>

/// @brief flip set
template <class T>
struct flip_set {
    flip_set() : data() {}

    const auto begin() const { return data.begin(); }
    auto begin() { return data.begin(); }
    const auto end() const { return data.end(); }
    auto end() { return data.end(); }

    bool empty() const { return data.empty(); }
    int size() const { return data.size(); }

    bool contains(const T &x) const { return data.count(x); }
    bool contains(T &&x) const { return data.count(std::move(x)); }

    bool flip(const T &x) {
        if (data.count(x)) return data.erase(x), false;
        else return data.emplace(x), true;
    }
    bool flip(T &&x) {
        if (data.count(x)) return data.erase(std::move(x)), false;
        else return data.emplace(x), true;
    }

  private:
    std::set<T> data;
};
Back to top page