我的具体问题是我有一个QMultiHash<Foo,Bar*> private成员,我想提供对哈希值的访问,但是对于const项目的版本,声明:
QList<const Bar*> getBars(Foo f) const;
Run Code Online (Sandbox Code Playgroud)
是否有一个更清洁/更有效的方法来"补充" Qt容器内的项目,而不是使用const项目和从源代码复制指针(QMultiHash<K,V>::values()在这种情况下)创建一个新容器的丑陋/低效?
我担心答案可能是"不",但我想确保我没有错过一些Qt/C++(03)语法魔法来做到这一点.
有两种方法。您提到的明显方法是使用 C++11 并自行将其转换为QList<const Bar*>.
QList<const Bar*> getList() const
{
QList<const Bar*> list;
for(Bar *b : m_List) //where m_List is your private memebr QList<Bar*>
list << b;
return list;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是将QList自身转换为const QList<Bar*>可以通过从 const 函数返回列表来“神奇地”完成的方法,例如:
const QList<Bar*> getList() const
{
return m_List; //where m_List is your private memebr QList<Bar*>
}
Run Code Online (Sandbox Code Playgroud)
使用哪一种取决于您的需要。根据您的描述,您需要检查元素而不更改它们。听起来您实际上根本不需要可修改列表。第一个变体听起来已经有点矫枉过正了。您之所以需要,const Bar*大概是因为您不希望它在检查项目时意外更改。例如,要检查所有元素,您可以执行以下操作(为每个元素自动添加 const):
for(const Bar *b : myObject->getList())
//do only const stuff with b
Run Code Online (Sandbox Code Playgroud)
除非您有充分的理由返回,QList<const Bar*>例如您需要可以修改列表,否则不值得为此带来麻烦和性能损失。当您以我描述的方式Bar *使用 C++11 或使用 const 迭代器自行访问它时,可以使用 const 进行限制。for根据我收集的信息,我建议使用它,而不是将(可能很大)列表的值转换为 const。
最后一个提示,如果您的列表确实很大并且您需要每一点性能下降,请考虑:
const QList<Bar*> &getList() const
Run Code Online (Sandbox Code Playgroud)
我相信 Qt 的隐式共享在前面的代码片段中自行完成了此操作,但这确保了在检查列表时永远不会复制或修改列表。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |