【数据结构】静态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);
}
};