gpt4 book ai didi

c++ - 使用带 boost::shared_ptr 的基类在 map 中查找

转载 作者:行者123 更新时间:2023-11-30 01:17:51 24 4
gpt4 key购买 nike

我正在寻找一种使用基类在 map 中查找元素的方法(下面的代码只是一个基本示例):

#include <map>
#include <boost/shared_ptr.hpp>

class Base {
public:
Base(int v) : id(v) {};
int id;
};

class Derived : public Base {
public:
Derived(int v) : Base(v) {};
};


int main()
{
std::map<boost::shared_ptr<Derived>, double> m;
m.insert(std::make_pair(boost::shared_ptr<Derived>(new Derived(1)), 10));
m.insert(std::make_pair(boost::shared_ptr<Derived>(new Derived(2)), 20));

auto b1 = boost::shared_ptr<Base>(new Base(1));
m.find(b1);

return 0;
}

基本上,我想比较 id 属性。编译器返回的错误如下:

main.cpp: In function 'int main()':
main.cpp:35:14: error: no matching function for call to 'std::map<boost::shared_ptr<Derived>, double>::find(boost::shared_ptr<Base>&)'
m.find(b1);
^
main.cpp:35:14: note: candidates are:
In file included from /usr/include/c++/4.8/map:61:0,
from main.cpp:1:
/usr/include/c++/4.8/bits/stl_map.h:820:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const key_type&) [with _Key = boost::shared_ptr<Derived> _Tp = double; _Compare = std::less<boost::shared_ptr<Derived> > _Alloc = std::allocator<std::pair<const boost::shared_ptr<Derived>, double> > std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::shared_ptr<Derived>, double> > std::map<_Key, _Tp, _Compare, _Alloc>::key_type = boost::shared_ptr<Derived>]
find(const key_type& __x)
^
/usr/include/c++/4.8/bits/stl_map.h:820:7: note: no known conversion for argument 1 from 'boost::shared_ptr<Base>' to 'const key_type& {aka const boost::shared_ptr<Derived>&}'
/usr/include/c++/4.8/bits/stl_map.h:835:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const key_type&) const [with _Key = boost::shared_ptr<Derived> _Tp = double; _Compare = std::less<boost::shared_ptr<Derived> > _Alloc = std::allocator<std::pair<const boost::shared_ptr<Derived>, double> > std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const boost::shared_ptr<Derived>, double> > std::map<_Key, _Tp, _Compare, _Alloc>::key_type = boost::shared_ptr<Derived>]
find(const key_type& __x) const
^
/usr/include/c++/4.8/bits/stl_map.h:835:7: note: no known conversion for argument 1 from 'boost::shared_ptr<Base>' to 'const key_type& {aka const boost::shared_ptr<Derived>&}'

最佳答案

如果您想使用您的 map 通过 id 进行查找,您需要传入一个适当的比较函数,以便 map 按 id 对其键进行排序而不是默认的 operator < (我相信,这是将所有权 block 地址与 boost::shared_ptr 参数进行比较)。

所以像这样改变 map :

struct Less_id
{
bool operator() (const boost::shared_ptr<Derived> &lhs, const boost::shared_ptr<Derived> &rhs) const
{
return lhs->id < rhs->id;
}
};

typedef std::map<boost::shared_ptr<Derived>, double, Less_id> Map;

Map m;

这将相应地对 map 进行排序,但仍然不允许通过 Base 进行查找指针。为此,您可以在 std::lower_bound 上面编写自己的函数。 :

Map::const_iterator find_base(const Map &map, const boost::shared_ptr<Base> &base)
{
auto it = std::lower_bound(
map.begin(), map.end(), base,
[](const Map::value_type &lhs, const boost::shared_ptr<Base> &rhs)
{ return lhs.first->id < rhs->id; }
);
if (it != map.end() && it->first->id == base->id)
return it;
else
return map.end();
}

std::lower_bound()用于保持对数复杂度 std::map::find()优惠。

Live example

关于c++ - 使用带 boost::shared_ptr 的基类在 map 中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23519163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com