【模板】自动清空数组
这个板子有什么意义?
检测对编译器的了解程度。
template <class T, int N>
struct acarray {
T val[N], rev;
int tim, vis[N];
struct refer {
acarray* ptr;
size_t pos;
refer() = delete;
refer(acarray& a, size_t pos) : ptr(&a), pos(pos) {}
operator T() const {
return ptr->vis[pos] < ptr->tim ? ptr->rev : ptr->val[pos];
}
refer& operator=(const T& x) {
ptr->vis[pos] = ptr->tim;
ptr->val[pos] = x;
return *this;
}
refer& operator=(const refer& r) { return *this = static_cast<T>(r); }
};
acarray() : tim(0) { memset(vis, 0, sizeof vis); }
refer operator[](size_t pos) { return refer(*this, pos); }
void reset(const T& r) {
++tim;
rev = r;
}
};
使用例:
template <class T, int N>
struct fenwick {
acarray<T, N + 10> t;
fenwick() { reset(); }
void modify(int p, T k) {
for (; p <= N; p += p & -p) t[p] = max(static_cast<int>(t[p]), k);
}
T query(int p) {
T r = -1;
for (; p >= 1; p -= p & -p) r = max(r, static_cast<int>(t[p]));
return r;
}
void reset() { t.reset(-1); }
};
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/17795830.html