c++ - 有效地将(Qt)对象容器转换为const对象容器?

标签 c++ qt

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

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

有没有比丑陋/低效地创建带有 const 项目和复制的新容器更清洁/更有效的方式来“压缩”Qt 容器的项目来自源的指针(在本例中为 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;
}

另一种方法是转换 QList本身到const QList<Bar*>这可以通过从 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*>例如你需要列表是可修改的,这是不值得的麻烦和性能损失。您可以限制 Bar *使用 C++11 for 自行访问它时使用 const以我描述的方式或使用 const 迭代器。根据我收集到的信息,我建议使用它而不是将(可能很大的)列表的值转换为 const。

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

const QList<Bar*> &getList() const

我相信 Qt 的隐式共享在前面的代码片段中自行完成了此操作,但这确保了列表在您检查时永远不会被复制或修改。

关于c++ - 有效地将(Qt)对象容器转换为const对象容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235310/

相关文章:

c++ - 文件映射 IPC 在 MapViewOfFile 调用时挂起

c++ - 如何使用/包含 QtNetwork 模块

c++ - 更改帮助窗口的大小以适合文本

linux - "symbol lookup error: ...: undefined symbol"(Qwt) 我应该设置 LD_LIBRARY_PATH 吗?

c++ - centos7中的qt版本

c++ - SCons StaticLibrary header 更改后未重建

c++ - 在特定时间淡入和淡出对象

c++ - 预处理器指令和#error

c++ - 为什么在 RemoveHead(node) 函数中使用 **head(而不是 *head)?

c++ - Qt 排队连接中的槽调用顺序