在一组shared_ptr<QString>中搜索

Searching in a set of shared_ptr<QString>

本文关键字:QString lt gt 搜索 ptr shared 一组      更新时间:2023-10-16

我有一个对象:

class Object {
public:
  boost::shared_ptr<QString> const& name() const {reutrn _name;}
private:
  boost::shared_ptr<QString> _name;
};

和multi_index集合

typedef
    boost::multi_index_container<
        Object,
        boost::multi_index::indexed_by<
            boost::multi_index::ordered_unique<
                boost::multi_index::const_mem_fun<
                    Object,
                    boost::shared_ptr<QString> const&,
                    & Object::name>,
                StringPointerLess> > >
    ObjectSet;

现在如果我想在集合中找到某个东西,我有QString我需要复制它来分配在堆中并创建shared_ptr

是否有可能避免这种不必要的复制操作,使集合保持原样?

一种更简单的方法:将以下成员函数添加到StringPointerLess比较谓词中:

struct StringPointerLess{
  ...
  bool operator()(boost::shared_ptr<QString> const& x,const QString& y)const{
    return *x<y;
  }
  bool operator()(const QString& x,boost::shared_ptr<QString> const& y)const{
    return x<*y;
  }
  ...
};

,现在您可以通过提供所需的QString进行查找:

IteratorType find( MyContainerType const& container, QString const& key )
{
   return container.find( key );
}

背后的魔力将在Boost中的特殊查找操作一节中解释。MultiIndex文档。

是的,你仍然需要创建一个shared_ptr,但是你可以使用一个自定义的删除器,它不会删除你的对象,然后把它作为一个指针从堆栈传递过来。

当然,你的问题之一是你的shared_pointer不是const,所以如果你有一个const QString &,你要么复制它或const_cast。我将做后者,但让你自己决定做什么。

我们不希望在传入QString的任何地方都这样做所以让我们写一个函数:

struct no_op_functor
{
 public:
   template< typename T > operator()( T* ) const
   {
   }
};
IteratorType find( MyContainerType const& container, QString const& key )
{
   boost::shared_ptr< QString > keyShared( const_cast<QString *>(&key), no_op_functor() );
   return container.find( keyShared );
}