C++ 在有序地图中实现天花板/地板/低/高
我正在尝试为一个定制的有序映射类实现天花板/地板/较低/较高的函数。目前我有两个语法错误:C++ 在有序地图中实现天花板/地板/低/高,c++,ordered-map,C++,Ordered Map,我正在尝试为一个定制的有序映射类实现天花板/地板/较低/较高的函数。目前我有两个语法错误: “>>应该是>>在嵌套模板中”,我已经以这种方式修改了它,但仍然会出现此错误 “BSIterator不命名类型” 你能告诉我怎么做ceilingEntry吗(它应该返回一个迭代器到最小键值大于或等于k的条目,或者返回end(),如果没有这样的条目或者映射为空)? 我试着把代码减到最小,我希望它是可以理解的 英国电信公司 #包括 #包括 #包括 模板 类LinkedBinaryTree{ 公众: 结构节点{
#包括
#包括
#包括
模板
类LinkedBinaryTree{
公众:
结构节点{
英语教学;
节点*PAR;
节点*左;
节点*右;
Node():elt(),par(NULL),right(NULL),left(NULL){
};
公众:
阶级地位{
公众:
节点*v;
公众:
位置(节点*_v=NULL):v(_v){}
操作员*()
{return v->elt;}
位置左()常量
{返回位置(v->左);}
位置右()常量
{返回位置(v->右);}
Position parent()常量
{返回位置(v->par);}
bool isRoot()常量
{return v->par==NULL;}
bool isExternal()常量
{return v->left==NULL&&v->right==NULL;}
布尔isInternal()常量
{return!isExternal();}
常量E&运算符*()常量{return v->elt;}
布尔运算符==(const Position&ppos)const{返回此->v==
ppos.v;}
朋友类LinkedBinaryTree;
};
类型定义标准::列表位置列表;
公众:
LinkedBinaryTree();
int getSize()常量;
bool isEmpty()常量;
位置根()常量;
PositionList positions()常量;
void addRoot();
外部(施工位置和p);
位置移除外部(常量位置和p);
受保护的:
无效预订单(节点*v、位置列表和pl)常量;
私人:
节点*_根;
int n;
};
模板
LinkedBinaryTree::LinkedBinaryTree()
:_根(NULL),n(0){}
模板
int LinkedBinaryTree::getSize()常量
{返回n;}
模板
bool LinkedBinaryTree::isEmpty()常量
{return getSize()==0;}
模板
typename LinkedBinaryTree::Position LinkedBinaryTree::root()常量
{返回位置(_根);}
模板
void LinkedBinaryTree::addRoot()
{u root=新节点;n=1;}
模板
void LinkedBinaryTree::expandExternal(const Position&p){
节点*v=p.v;
v->left=新节点;
v->左->标准杆=v;
v->right=新节点;
v->右->标准杆=v;
n+=2;
}
模板
typename LinkedBinaryTree::Position
LinkedBinaryTree::removeAboveExternal(常量位置和p){
节点*w=p.v;节点*v=w->par;
节点*sib=(w==v->左?v->右:v->左);
if(v==\u根){
_根=同胞;
sib->par=NULL;
}
否则{
节点*gpar=v->par;
如果(v==gpar->left)gpar->left=sib;
else gpar->right=sib;
sib->par=gpar;
}
删除w;删除v;
n-=2;
返回位置(sib);
};
模板
typename LinkedBinaryTree::PositionList LinkedBinaryTree::positions()
常数{
职位列表pl;
前序(_根,pl);
返回位置列表(pl);
}
模板
void LinkedBinaryTree::预订单(节点*v、位置列表和pl)常量{
pl.推回(位置(v));
如果(v->left!=NULL)
预订单(v->左,pl);
如果(v->右!=NULL)
预订单(v->右,pl);
}
英国夏令时
模板
班级报名{
公众:
typedef K键;
类型定义V值;
公众:
条目(常数K&K=K(),常数V&V=V())
:_键(k),_值(v){}
常量K&key()常量{return_key;}
常量V&value()常量{return_value;}
void setKey(常数K&K){u key=K;}
void setValue(const V&V){u value=V;}
私人:
K_键;
V_值;
};
//搜索树
模板
类搜索树{
公众:
typedef typename E::键K;
typedef typename E::值V;
typedef-LinkedBinaryTree-BinaryTree;
typedef typename LinkedBinaryTree::Position TPO;
公众:
类迭代器{
公众:
TPos v;
公众:
迭代器(const-TPos&vv):v(vv){}
常量E&运算符*()常量{return*v;}
E&运算符*(){return*v;}
布尔运算符==(常量迭代器&p)常量{return v==p.v;}
迭代器和运算符++();
朋友类搜索树;
};
公众:
SearchTree();
int getSize()常量;
bool isEmpty()常量;
迭代器查找(常量K&K);
迭代器插入(常数K&K,常数V&x);
无效擦除(常数K&K);
无效擦除(常量迭代器&p);
迭代器begin();
迭代器end();
TPos root()常量;
TPos查找器(常数K&K、常数TPos&v);
TPos插入器(常数K&K、常数V&x);
TPos橡皮擦(TPos&v);
TPO重组(持续TPO&v);
私人:
二叉树;
int n;
};
模板
int SearchTree::getSize()常量{return n;}
模板
bool SearchTree::isEmpty()常量{return n==0;}
模板
typename SearchTree::Iterator&SearchTree::Iterator::operator++(){
TPos w=v.右();
if(w.isInternal()){
do{v=w;w=w.left();}
而(w.isintral());
}
否则{
w=v.parent();
而(v==w.right())
{v=w;w=w.parent();}
v=w;
}
归还*这个;
}
模板
SearchTree::SearchTree():T(),n(0)
{T.addRoot();T.expandExternal(T.root());}
模板
typename SearchTree::TPos SearchTree::root()常量
{返回T.root().left();}
模板
typename SearchTree::迭代器SearchTree::begin(){
TPos v=root();
而(v.isInternal())v=v.left();
返回迭代器(v.parent());
}
模板
typename SearchTree::迭代器SearchTree::end()
{返回迭代器(T.root());}
模板
typename SearchTree::TPos SearchTree::finder(常数K&K、常数TPos&
(五){
if(v.isExternal())返回v;
if(k<(*v.key())返回查找器(k,v.left());
else if((*v.key()
OrderedMap.h
#包括“BST.h”
模板
类OrderedMap:公共搜索树{
公众:
类型定义搜索树BST;
typedef typename SearchTree::迭代器BSTIterator;
typedef typename搜索树::TPos TPos;
公众:
OrderedMap():SearchTree(){
#include<iostream>
#include<list>
#include<stdio.h>
template <typename E>
class LinkedBinaryTree {
public:
struct Node{
E elt;
Node* par;
Node* left;
Node* right;
Node() : elt(), par(NULL), right(NULL), left(NULL){}
};
public:
class Position{
public:
Node* v;
public:
Position(Node* _v = NULL):v(_v){}
E& operator*()
{return v->elt;}
Position left() const
{return Position(v->left);}
Position right() const
{return Position(v->right);}
Position parent() const
{return Position(v->par);}
bool isRoot() const
{return v->par == NULL;}
bool isExternal() const
{return v->left == NULL && v->right == NULL;}
bool isInternal() const
{return !isExternal();}
const E& operator*() const {return v->elt;}
bool operator==(const Position& ppos) const { return this->v ==
ppos.v ;}
friend class LinkedBinaryTree;
};
typedef std::list<Position> PositionList;
public:
LinkedBinaryTree();
int getSize() const;
bool isEmpty() const;
Position root() const;
PositionList positions() const;
void addRoot();
void expandExternal(const Position& p);
Position removeAboveExternal(const Position& p);
protected:
void preorder(Node* v, PositionList& pl) const;
private:
Node* _root;
int n;
};
template <typename E>
LinkedBinaryTree<E>::LinkedBinaryTree()
:_root(NULL), n(0) {}
template <typename E>
int LinkedBinaryTree<E>::getSize() const
{return n;}
template <typename E>
bool LinkedBinaryTree<E>::isEmpty() const
{return getSize() == 0;}
template <typename E>
typename LinkedBinaryTree<E>::Position LinkedBinaryTree<E>::root() const
{return Position(_root);}
template <typename E>
void LinkedBinaryTree<E>::addRoot()
{_root = new Node; n = 1;}
template <typename E>
void LinkedBinaryTree<E>::expandExternal(const Position& p){
Node* v = p.v;
v->left = new Node;
v->left->par = v;
v->right = new Node;
v->right->par = v;
n += 2;
}
template <typename E>
typename LinkedBinaryTree<E>::Position
LinkedBinaryTree<E>::removeAboveExternal(const Position& p){
Node* w = p.v; Node* v = w->par;
Node* sib = (w==v->left ? v->right:v->left);
if(v == _root){
_root = sib;
sib->par = NULL;
}
else{
Node* gpar = v->par;
if(v == gpar->left) gpar->left = sib;
else gpar->right = sib;
sib->par = gpar;
}
delete w; delete v;
n -= 2;
return Position(sib);
};
template <typename E>
typename LinkedBinaryTree<E>::PositionList LinkedBinaryTree<E>::positions()
const{
PositionList pl;
preorder(_root, pl);
return PositionList(pl);
}
template <typename E>
void LinkedBinaryTree<E>::preorder(Node* v, PositionList& pl) const{
pl.push_back(Position(v));
if(v->left != NULL)
preorder(v->left, pl);
if(v->right != NULL)
preorder(v->right, pl);
}
template<typename K, typename V>
class Entry{
public:
typedef K Key;
typedef V Value;
public:
Entry(const K& k = K(), const V& v = V())
:_key(k), _value(v) {}
const K& key() const {return _key;}
const V& value() const {return _value;}
void setKey(const K& k) {_key = k;}
void setValue(const V& v){_value = v;}
private:
K _key;
V _value;
};
//Search Tree
template <typename E>
class SearchTree{
public:
typedef typename E::Key K;
typedef typename E::Value V;
typedef LinkedBinaryTree<E> BinaryTree;
typedef typename LinkedBinaryTree<E>::Position TPos;
public:
class Iterator{
public:
TPos v;
public:
Iterator(const TPos& vv) : v(vv) {}
const E& operator*() const {return *v;}
E& operator*() {return *v;}
bool operator==(const Iterator& p) const {return v == p.v;}
Iterator& operator++();
friend class SearchTree;
};
public:
SearchTree();
int getSize() const ;
bool isEmpty() const ;
Iterator find(const K& k);
Iterator insert(const K& k, const V& x);
void erase(const K& k);
void erase(const Iterator& p);
Iterator begin();
Iterator end();
TPos root() const;
TPos finder(const K& k, const TPos& v);
TPos inserter(const K& k, const V& x);
TPos eraser(TPos& v);
TPos restructure(const TPos& v);
private:
BinaryTree T;
int n;
};
template <typename E>
int SearchTree<E>::getSize() const {return n ;}
template <typename E>
bool SearchTree<E>::isEmpty() const {return n==0; }
template <typename E>
typename SearchTree<E>::Iterator& SearchTree<E>::Iterator::operator++(){
TPos w = v.right();
if(w.isInternal()){
do{v=w; w = w.left();}
while(w.isInternal());
}
else{
w = v.parent();
while(v == w.right())
{v = w; w = w.parent();}
v = w;
}
return *this;
}
template <typename E>
SearchTree<E>::SearchTree(): T(), n(0)
{T.addRoot(); T.expandExternal(T.root());}
template <typename E>
typename SearchTree<E>::TPos SearchTree<E>::root() const
{return T.root().left();}
template <typename E>
typename SearchTree<E>::Iterator SearchTree<E>::begin(){
TPos v = root();
while (v.isInternal()) v = v.left();
return Iterator(v.parent());
}
template <typename E>
typename SearchTree<E>::Iterator SearchTree<E>::end()
{return Iterator(T.root());}
template <typename E>
typename SearchTree<E>::TPos SearchTree<E>::finder(const K& k, const TPos&
v){
if(v.isExternal()) return v;
if(k < (*v).key()) return finder(k,v.left());
else if((*v).key() < k) return finder(k,v.right());
else return v;
}
template <typename E>
typename SearchTree<E>::Iterator SearchTree<E>::find(const K& k){
TPos v = finder(k, root());
if(v.isInternal()) return Iterator(v);
else return end();
}
#include "BST.h"
template <typename KK, typename VV>
class OrderedMap: public SearchTree<Entry<KK,VV> > {
public:
typedef SearchTree<Entry<KK,VV> > BST;
typedef typename SearchTree<Entry<KK,VV> >::Iterator BSTIterator;
typedef typename SearchTree<Entry<KK,VV> >::TPos TPos;
public:
OrderedMap(): SearchTree<Entry<KK,VV> >(){}
bool empty () const ;
BSTIterator find ( const KK& k) const {find(k);}
BSTIterator end () {return BST::end();}
BSTIterator ceilingEntry(const KK& k);
BSTIterator ceilingEntry(const KK& k, TPos & w);
//...
};
template <typename KK, typename VV>
BSTIterator OrderedMap<KK,VV>::ceilingEntry(const KK& k) {
if (OrderedMap<KK,VV>::empty()) { return OrderedMap<KK,VV>::end(); }
return ceilingEntry(k, BST.root());
}
template <typename KK, typename VV>
BSTIterator OrderedMap<KK,VV>::ceilingEntry(const KK& k, TPos & w) {
// what to write here?
}