在一组shared_ptr<QString>中搜索
Searching in a set of shared_ptr<QString>
我有一个对象:
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 );
}
相关文章:
- 将 Qvector<uint8_t> 转换为 QString
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- Qt C++ 如何在 1 个命令中砍掉属于 QStringList 成员的 QString 字母
- 为什么使用 QString::right 在字符串开头省略逗号?
- Qt:更新 QString 时自动生成的代码失败
- 如何将 QString 的 QList 分配给列表视图?
- 加倍到 QString 并保存在 QJsonDocument 中
- 如何将包含指数的 QString 转换为C++中的双倍?
- 是否可以直接将QString输入(例如)googletest的ADD_FAILURE()宏?
- 如何从 QString 中包含的十六进制值中获取 ASCII 字符?
- 将 QAction 的 QString 文本作为参数传递
- 如何计算QString开头的重复字符?
- 将 nullptr QVariant 与空 QString 进行比较,在 Qt5.9 和 Qt5.12 中给出了不同的输
- 在Qt-cpp中通过像素获取QString的子字符串