C++ 发出重载箭头(->;)运算符c++;
我有一个存储数据的自定义容器和一个访问它的迭代器。问题是迭代器中的->运算符不允许我修改容器中的数据 值类型是一个std::pair 资料持有人:C++ 发出重载箭头(->;)运算符c++;,c++,templates,operators,iteration,overloading,C++,Templates,Operators,Iteration,Overloading,我有一个存储数据的自定义容器和一个访问它的迭代器。问题是迭代器中的->运算符不允许我修改容器中的数据 值类型是一个std::pair 资料持有人: template <class tree> struct avl_node { private: typedef typename tree::key_type Key; typedef typename tree::mapped_type Type; typedef typename t
template <class tree>
struct avl_node {
private:
typedef typename tree::key_type Key;
typedef typename tree::mapped_type Type;
typedef typename tree::value_type value_type;
public:
typedef avl_node* node_ptr;
typedef const avl_node* const_node_ptr;
node_ptr _parentNode, _leftNode, _rightNode;
int _balance;
Key first;
Type second;
}
模板
结构avl_节点{
私人:
typedef typename树::key_type key;
typedef typename树::映射的_类型类型;
typedef typename树::值\类型值\类型;
公众:
typedef avl_node*node_ptr;
typedef const avl_node*const_node_ptr;
节点\u ptr\u parentNode、\u leftNode、\u rightNode;
国际收支平衡;
关键优先;
第二类;
}
迭代器:
template <class tree>
class avl_iterator {
public:
typedef typename tree::node node;
typedef typename tree::node_ptr node_ptr;
typedef typename tree::const_node_ptr const_node_ptr;
typedef typename tree::utilities utilities;
typedef typename tree::value_type value_type;
private:
node_ptr _node;
public:
avl_iterator() : _node() { }
avl_iterator( const node_ptr node ) : _node ( node ) { }
~avl_iterator() { _node = NULL; }
avl_iterator& operator=(const avl_iterator& rhs) {
_node = rhs._node;
return (*this);
}
bool operator == ( const avl_iterator& rhs ) { return ( _node == rhs._node); }
bool operator != ( const avl_iterator& rhs ) { return ( _node != rhs._node); }
avl_iterator& operator++()
{
_node = utilities::next_node( _node );
return (*this);
}
avl_iterator& operator ++( int ) {
avl_iterator temp(*this);
++(*this);
return(temp);
}
avl_iterator& operator -- () {
_node = utilities::prev_node( _node );
return (*this);
}
avl_iterator& operator -- ( int ) {
avl_iterator temp(*this);
--(*this);
return(temp);
}
value_type& operator * () {
return value_type( node->first, node->second );
}
node_ptr operator -> () const {
return _node;
}
};
模板
类avl_迭代器{
公众:
typedef typename树::节点节点;
typedef typename树::node_ptr node_ptr;
typedef typename树::const_node_ptr const_node_ptr;
typedef typename树::实用程序;
typedef typename树::值\类型值\类型;
私人:
node_ptr_node;
公众:
avl_迭代器():_节点(){}
avl_迭代器(const node_ptr node):_node(node){}
~avl_迭代器(){u node=NULL;}
avl_迭代器和运算符=(常量avl_迭代器和rhs){
_节点=右侧。_节点;
返回(*本条);
}
布尔运算符==(const avl_迭代器&rhs){return(_node==rhs._node);}
布尔运算符!=(const avl_iterator&rhs){return(_node!=rhs._node);}
avl_迭代器和运算符++()
{
_node=实用程序::下一个\u节点(\u节点);
返回(*本条);
}
avl_迭代器和运算符++(int){
avl_迭代器温度(*此);
++(*本条);
返回(临时);
}
avl_迭代器和运算符--(){
_节点=实用工具::上一个节点(_节点);
返回(*本条);
}
avl_迭代器和运算符--(int){
avl_迭代器温度(*此);
--(*本条);
返回(临时);
}
值类型和运算符*(){
返回值类型(节点->第一,节点->第二);
}
节点_ptr运算符->()常量{
返回_节点;
}
};
主要
试试看{
使用名称空间avl;
avltree树;
插入(intPair(1,1));
插入(intPair(2,1));
插入(intPair(3,1));
插入(intPair(4,1));
插入(intPair(5,1));
插入(intPair(6,1));
插入(intPair(7,1));
插入(intPair(8,1));
插入(intPair(9,1));
插入(intPair(10,1));
插入(intPair(11,1));
插入(intPair(12,1));
avltree::迭代器;
//std::map::it迭代器;
for(it=tree.begin();it!=tree.end();+it)
{
std::coutfirst最好是
value_type value;
在avl_节点中
而不是:
Key first;
Type second;
然后,您可以在avl\u迭代器中定义:
value_type& operator * () const {
return _node->value;
}
value_type* operator -> () const {
return &_node->value;
}
最好有
value_type value;
在avl_节点中
而不是:
Key first;
Type second;
然后,您可以在avl\u迭代器中定义:
value_type& operator * () const {
return _node->value;
}
value_type* operator -> () const {
return &_node->value;
}
你能显示客户端代码吗?@AndyProwl,如果你是指我用来测试的代码,它被添加到帖子的底部是的,这就是我的意思。那么你的问题是:它允许或不允许修改?你的问题文本与你评论的代码冲突。你能显示客户端代码吗?@AndyProwl,如果你是指我用来测试的代码是的,这就是我的意思所以你的问题是:它允许或不允许修改?你的问题文本与你的注释代码冲突