将(Qt)对象容器转换为const对象的容器有效吗?

时间:2015-08-26 19:38:58

标签: c++ qt

我的具体问题是我有QMultiHash<Foo,Bar*> private成员,我想提供对哈希值的访问权限,但是要 const 版本的项目,声明:

QList<const Bar*> getBars(Foo f) const;

是否有一个更清洁/更有效的方法来“补充”内部一个Qt容器中的项目比使用const项目和复制的新容器的丑陋/低效创建来自源的指针(在这种情况下为QMultiHash<K,V>::values())?

我担心答案可能是“不”,但我想确保我没有错过一些Qt / C ++(03)语法魔法来做到这一点。

2 个答案:

答案 0 :(得分:0)

有两种方法。你提到的显而易见的方法是使用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;
}

另一种方法是将QList本身转换为const QList<Bar*>,这可以完成&#34;神奇地&#34;通过从const函数返回列表,例如:

const QList<Bar*> getList() const
{ 
    return m_List; //where m_List is your private memebr QList<Bar*>
} 

使用哪一个取决于您的需求。根据您的描述,您需要检查元素而不更改它们。听起来你根本不需要可修改的列表。第一个变体听起来就像一个矫枉过正。您希望const Bar*大概是因为您不希望在检查项目时意外更改它。例如,您可以检查所有元素(为每个元素自动添加const):

for(const Bar *b : myObject->getList())
    //do only const stuff with b

除非你有一个非常好的理由返回QList<const Bar*>,例如你需要列表可以修改,否则不值得遇到麻烦和性能损失。当您通过我所描述的方式使用C ++ 11 Bar *或使用const迭代器自己访问时,可以使用const限制for。根据我收集的内容,我建议使用它,而不是转换(可能很大)列表&#39;值为const。

最后一个提示,如果你的名单非常庞大,你需要考虑每一个性能:

const QList<Bar*> &getList() const

Qt的隐式共享在我之前的代码片段中完成了这一点我相信但是这确保了在检查时不会复制或修改列表。

答案 1 :(得分:0)

没有有效的方法来“补充”现有数组中的对象。但是,如果你真的存储指针列表。可以快速将“const”指针转换为简单循环中的“const”指针?! (即制作新名单) 当您填写该列表时,第二个解决方案是在列表最初中生成“const”对象。 第三种方法是使列表中的自己的子类可以返回“const”引用或迭代器到存储的元素。