C++ 高效地将(Qt)对象容器转换为常量对象容器?

C++ 高效地将(Qt)对象容器转换为常量对象容器?,c++,qt,C++,Qt,我的具体问题是,我有一个QMultiHashprivate成员,我想提供对散列值的访问,但要访问项目的const版本,声明: QList<const Bar*> getBars(Foo f) const; QList getbar(Foo f)const; 有没有一种更干净/更有效的方法来“组合”Qt容器中的项而不是用const项创建一个丑陋/低效的新容器并从源代码复制指针(QMultiHash::values()) 我担心答案可能是“不”,但我想确保我没有遗漏一些Qt/C++(

我的具体问题是,我有一个
QMultiHash
private
成员,我想提供对散列值的访问,但要访问项目的
const
版本,声明:

QList<const Bar*> getBars(Foo f) const;
QList getbar(Foo f)const;
有没有一种更干净/更有效的方法来“组合”Qt容器中的项而不是用const项创建一个丑陋/低效的新容器并从源代码复制指针(
QMultiHash::values()


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

有两种方法。您提到的一个明显的方法是使用C++11,并自己将其转换为
QList

使用哪一种取决于您的需要。根据您描述的内容,您需要在不改变元件的情况下检查元件。听起来你根本不需要修改列表。第一种变体听起来已经有些过分了。您想要
const Bar*
大概是因为您不希望在检查项目时意外更改它。例如,要检查所有元素,您可以执行以下操作(为每个元素自动添加常量):

除非您有一个返回
QList
的很好的理由,比如需要修改列表,否则就不值得麻烦和性能损失。当您自己使用C++11
for
以我描述的方式或使用const迭代器访问时,可以使用const限制
Bar*
。从我收集的信息来看,我建议使用它,而不是将(可能很大的)列表的值转换为常量

最后一个提示是,如果您的列表非常庞大,您需要每一点性能,请考虑:

const QList<Bar*> &getList() const
const-QList&getList()const
我相信在前面的代码片段中,Qt的隐式共享本身就可以做到这一点,但这确保了在检查列表时,列表永远不会被复制或修改。

没有有效的方法“构造”现有数组中的对象。但如果你真的存储了指针列表。在简单的循环中将not“const”指针转换为“const”指针可能很快?!(即制作新列表) 第二种解决方案是在填充列表时,首先在列表中创建“const”对象。
第三种方法是在列表中创建自己的子类,该类只能返回存储元素的“const”引用或迭代器。

看,我不知道一个解决方案(除了一个巨大的丑陋的hack),但是
循环的
有什么大不了的吗?它只是复制指针,我怀疑它会影响您的性能-除非
QList
非常庞大&而且您有非常高的性能要求。另外,请检查原因。在这种情况下,这不是什么大问题(我已经这样做并实现了它)。但它冒犯了我的风格感,在我的应用程序(交互式数据可视化)的其他情况下,我可能需要在约1000-10000s个图表图示符对象的容器上执行交互式UI操作,其中我正在检查但不更改图示符对象,而不延迟UI以获得常量指针的容器。请注意,我的实际成员是QMultiHash,我想提供常量访问的是QMultiHash::values()中的值列表,因此最后一个常量引用不是选项。还要注意,提供这种访问器的一个主要原因是常量的正确性;另外,我不希望依靠我自己或其他人的好感(通过常量迭代器等)来适当地访问该列表。@eclarkso在这种情况下,您唯一的选择就是自己创建这样一个列表。即使存在一个函数可以为您创建它,它也会做几乎相同的事情——使用常量元素创建新列表。无论如何,请使用C++11来完成,因为这是目前可用的最快的方法。除非您遇到性能问题,检查时间过长,因为列表太大(转换时间过长),否则应该没有问题。如果性能确实成为一个问题,您可能需要重新考虑您的优先级或设计。祝你好运希望你理解我没有代码的例子。如果没有,请告诉我。我会详细解释。
const QList<Bar*> getList() const
{ 
    return m_List; //where m_List is your private memebr QList<Bar*>
} 
for(const Bar *b : myObject->getList())
    //do only const stuff with b
const QList<Bar*> &getList() const