Ser*_*sak 3 c++ containers std
比方说,我们要对 进行子类化std::map,并且需要捕获容器中的所有插入和删除操作。例如,为了保存有关容器中存在的密钥的一些特定于应用程序的信息。
如果可能的话,最简单的方法是什么?
也许,最明显的方法是重写执行插入和删除的所有方法和运算符。但我想,这样一来,很容易就会忽略一些东西,不是吗?
一般情况下没有办法做到这一点。继承不是一个好主意,因为std::map它不是多态的,并且当您使用指向映射的指针时不会发生虚拟调度。此时您不妨使用一个简单的包装类,这样可以省去很多麻烦:
#include <iostream>
#include <map>
template <class Key, class Value>
struct Map {
private:
std::map<Key, Value> _data;
public:
template <class Y, class T>
void insert(Y &&key, T &&val) {
std::cout << "[" << key << "] = " << val << "\n";
_data.insert_or_assign(std::forward<Y>(key), std::forward<T>(val));
}
void remove(Key const &key) {
auto const it = _data.find(key);
if (it == _data.end())
return;
std::cout << "[" << key << "] -> removed\n";
_data.erase(it);
}
Value *get(Key const &key) {
auto const it = _data.find(key);
if (it == _data.end())
return nullptr;
return &it->second;
}
};
int main() {
Map<int, char const *> map;
map.insert(10, "hello");
map.insert(1, "world");
map.remove(1);
map.remove(10);
map.remove(999);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |