【数据结构】静态set

强烈建议insert之前先reserve出估计的元素大小,毕竟是静态set实际上大概要用多少空间是可以提前知道的。这样一方面可以节省大约20%内存,另一方面避免了扩容时复制,速度大概提升了10%。

template <class value_type>
struct const_set {
  private:
    vector<value_type> vec;

    decltype (vec.begin()) find (const value_type& value) {
        auto it = std::lower_bound (vec.begin(), vec.end(), value);
        if (it == vec.end() || *it != value) {
            return vec.end();
        }
        return it;
    }

  public:
    void clear() {
        vec.clear();
    }

    void reserve (int n) {
        vec.reserve (n);
    }

    void sort() {
        std::sort (vec.begin(), vec.end());
    }

    int count (const value_type& value) {
        auto it = find (value);
        if (it == vec.end()) {
            return 0;
        }
        return 1;
    }

    void insert (const value_type& value) {
        vec.push_back (value);
    }

    decltype (vec.begin()) begin () {
        return vec.begin();
    }

    decltype (vec.begin()) end () {
        return vec.end();
    }

    decltype (vec.begin()) lower_bound (const value_type& value) {
        return std::lower_bound (vec.begin(), vec.end(), value);
    }

};

下面这个是画蛇添足的版本,优化了亿点点sort的复杂度,没必要啊。

template <class value_type>
struct const_set {
  private:
    vector<value_type> vec;
    int vec_sorted_len;

    decltype (vec.begin()) find (const value_type& value) {
        auto it = lower_bound (vec.begin(), vec.begin() + vec_sorted_len, value);
        if (it == vec.begin() + vec_sorted_len || *it != value) {
            it = vec.end();
        }
        return it;
    }

  public:
    void clear() {
        vec.clear();
        vec_sorted_len = 0;
    }

    void sort() {
        std::sort (vec.begin() + vec_sorted_len, vec.end());
        std::inplace_merge (vec.begin(), vec.begin() + vec_sorted_len, vec.end());
        vec_sorted_len = vec.size();
    }

    int count (const value_type& value) {
        auto it = find (value);
        if (it != vec.end()) {
            return 1;
        }
        return 0;
    }

    void insert (const value_type& value) {
        vec.push_back (value);
    }

};
posted @ 2023-12-04 16:46  purinliang  阅读(8)  评论(0编辑  收藏  举报