map std 浮点数索引_C ++-检查std :: map中是否存在-计数与查找

根据源代码,我建议使用xtree。请参见源代码。

在GCC中,代码如下(xtree):

const_iterator

find(const key_type& __x) const

{ return _M_t.find(__x); }

size_type

count(const key_type& __x) const

{ return _M_t.find(__x) == _M_t.end() ? 0 : 1; }

在Windows平台上的Visual Studio中,代码如下(xtree):

const_iterator find(const key_type& _Keyval) const

{ // find an element in nonmutable sequence that matches _Keyval

const_iterator _Where = lower_bound(_Keyval);

return (_Where == end()

|| _DEBUG_LT_PRED(this->_Getcomp(),

_Keyval, this->_Key(_Where._Mynode()))

? end() : _Where);

}

//....

const_iterator lower_bound(const key_type& _Keyval) const

{ // find leftmost node not less than _Keyval in nonmutable tree

return (const_iterator(_Lbound(_Keyval), this));

}

//....

_Nodeptr _Lbound(const key_type& _Keyval) const

{ // find leftmost node not less than _Keyval

_Nodeptr _Pnode = _Root();

_Nodeptr _Wherenode = this->_Myhead; // end() if search fails

while (!this->_Isnil(_Pnode))

if (_DEBUG_LT_PRED(this->_Getcomp(), this->_Key(_Pnode), _Keyval))

_Pnode = this->_Right(_Pnode); // descend right subtree

else

{ // _Pnode not less than _Keyval, remember it

_Wherenode = _Pnode;

_Pnode = this->_Left(_Pnode); // descend left subtree

}

return (_Wherenode); // return best remembered candidate

}

//..........................................

//..........................................

size_type count(const key_type& _Keyval) const

{ // count all elements that match _Keyval

_Paircc _Ans = equal_range(_Keyval);

size_type _Num = 0;

_Distance(_Ans.first, _Ans.second, _Num);

return (_Num);

}

//....

_Pairii equal_range(const key_type& _Keyval) const

{ // find range equivalent to _Keyval in nonmutable tree

return (_Eqrange(_Keyval));

}

//....

_Paircc _Eqrange(const key_type& _Keyval) const

{ // find leftmost node not less than _Keyval

_Nodeptr _Pnode = _Root();

_Nodeptr _Lonode = this->_Myhead; // end() if search fails

_Nodeptr _Hinode = this->_Myhead; // end() if search fails

while (!this->_Isnil(_Pnode))

if (_DEBUG_LT_PRED(this->_Getcomp(), this->_Key(_Pnode), _Keyval))

_Pnode = this->_Right(_Pnode); // descend right subtree

else

{ // _Pnode not less than _Keyval, remember it

if (this->_Isnil(_Hinode)

&& _DEBUG_LT_PRED(this->_Getcomp(), _Keyval,

this->_Key(_Pnode)))

_Hinode = _Pnode; // _Pnode greater, remember it

_Lonode = _Pnode;

_Pnode = this->_Left(_Pnode); // descend left subtree

}

_Pnode = this->_Isnil(_Hinode) ? _Root()

: this->_Left(_Hinode); // continue scan for upper bound

while (!this->_Isnil(_Pnode))

if (_DEBUG_LT_PRED(this->_Getcomp(), _Keyval, this->_Key(_Pnode)))

{ // _Pnode greater than _Keyval, remember it

_Hinode = _Pnode;

_Pnode = this->_Left(_Pnode); // descend left subtree

}

else

_Pnode = this->_Right(_Pnode); // descend right subtree

const_iterator _First = const_iterator(_Lonode, this);

const_iterator _Last = const_iterator(_Hinode, this);

return (_Paircc(_First, _Last));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值