任何想法为什么QHash和QMap返回const T而不是const T&?

Mad*_*adH 9 c++ hash performance qt reference

与std :: map和std :: hash_map不同,Qt中的相应版本无需返回引用.如果我为相当庞大的类构建一个哈希值,这不是很低效吗?

编辑

特别是因为有一个单独的方法value(),然后可以按值返回它.

Mar*_*utz 29

STL容器的const下标运算符可以返回引用到const,因为它们使用容器中不存在的索引来拒绝对它的调用.在这种情况下的行为是不确定的.因此,作为明智的设计选择,std::map甚至不提供const下标运算符重载.

QMap试图更容易调整,提供const下标操作符重载作为语法糖,遇到问题与不存在的键,再次尝试更容易,并返回默认构造的值.

如果你想保持STL的收益按常量引用约定,你需要分配一个静态值,并返回到基准.然而,这与提供的重入保证完全不一致QMap,因此唯一的选择是按价值返回.在const有就是糖衣,以防止一些愚蠢的错误,就像constmap["foo"]++从编译.

也就是说,通过引用返回并不总是最有效的方式.如果你返回一个基本类型,或者更积极的优化,当sizeof(T)<=sizeof(void*)返回值经常使编译器直接将结果返回寄存器而不是间接(地址导致寄存器)或者天堂禁止堆栈时.

另一个原因(除了过早pessimisation)更喜欢通过噪声const的引用,切片,在这里不适用,因为这两个std::mapQMap是价值为基础,因此是均匀的.对于异构容器,您需要保持指针,指针是基本类型(当然除了智能类型).

总而言之,我几乎从未在Qt中使用const下标运算符.是的,它的语法比find()+ 更好*it,但总是会在const下标运算符前面调用count()/ contains()调用,这意味着你要进行两次二进制搜索.而且那么你不会注意到在返回值的性能差异微乎其微反正:)

对于value() const,不过,我认为,它应该返回引用给const,默认为引用到默认值被传递作为第二个参数,但我猜的Qt开发人员觉得这是太多神奇.


Ada*_*m W 5

operator[]由于 Martin B 所说的原因,QMap 和 QHash 的文档特别指出要避免查找。

如果您想要 const 引用,请使用const_iterator find ( const Key & key ) constwhere 您可以使用以下任何一个:

const Key & key () const
const T & value () const
const T & operator* () const
const T * operator-> () const
Run Code Online (Sandbox Code Playgroud)