|
@@ -43,11 +43,18 @@ TEMPLATE(HOLDER) NODE::~Node() {
|
|
|
|
|
|
// #pragma region Tire<Type>
|
|
|
TEMPLATE(HOLDER) ADT::Tire() {
|
|
|
+ _is_subtree = false;
|
|
|
+}
|
|
|
|
|
|
+TEMPLATE(HOLDER) ADT::Tire(Node* root) {
|
|
|
+ _root = root;
|
|
|
+ _is_subtree = true;
|
|
|
}
|
|
|
|
|
|
TEMPLATE(HOLDER) ADT::~Tire() {
|
|
|
- delete _root;
|
|
|
+ if (_is_subtree == false) {
|
|
|
+ delete _root;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
TEMPLATE(typename ITERATOR) ADT::find(const std::string& key) {
|
|
@@ -137,17 +144,53 @@ TEMPLATE(size_t) ADT::erase(const std::string& key) {
|
|
|
curr = next;
|
|
|
}
|
|
|
}
|
|
|
- size_t res = curr->value == nullptr ? 0 : 1;
|
|
|
- _container.erase(curr->value);
|
|
|
- curr->value = nullptr;
|
|
|
- return res;
|
|
|
+ if (curr->value == nullptr) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ _container.erase(curr->value);
|
|
|
+ curr->value = nullptr;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+TEMPLATE(ADT&) ADT::set_prefix(string& key) {
|
|
|
+ Node* curr = _root;
|
|
|
+ Node* next = nullptr;
|
|
|
+ for (const char& ch : key) {
|
|
|
+ {
|
|
|
+ // 高 4 位
|
|
|
+ unsigned int h = ((unsigned char)ch >> 4) & 0x0fu;
|
|
|
+ next = curr->next[h];
|
|
|
+ if (next == nullptr) {
|
|
|
+ curr->bitmap |= 0x01u << h;
|
|
|
+ curr = curr->next[h] = new Node();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ curr = next;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ {
|
|
|
+ // 低 4 位
|
|
|
+ unsigned int l = ch & 0x0fu;
|
|
|
+ next = curr->next[l];
|
|
|
+ if (next == nullptr) {
|
|
|
+ curr->bitmap |= 0x01u << l;
|
|
|
+ curr = curr->next[l] = new Node();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ curr = next;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Tire(curr);
|
|
|
}
|
|
|
|
|
|
-TEMPLATE(typename ITERATOR) ADT::begin() { return _container.begin(); }
|
|
|
+TEMPLATE(typename ITERATOR) ADT::begin() { return _is_subtree == false ? _container.begin() : _container.end(); }
|
|
|
|
|
|
TEMPLATE(typename ITERATOR) ADT::end() { return _container.end(); }
|
|
|
|
|
|
-TEMPLATE(typename ITERATOR) ADT::rbegin() { return _container.rbegin(); }
|
|
|
+TEMPLATE(typename ITERATOR) ADT::rbegin() { return _is_subtree == false ? _container.rbegin() : _container.rend(); }
|
|
|
|
|
|
TEMPLATE(typename ITERATOR) ADT::rend() { return _container.rend(); }
|
|
|
|