QMap中的boost :: multi_index_container

时间:2014-10-07 16:58:39

标签: qt boost move-semantics qt4.8 qt5.3

是否可以使用QMap< QString, boost::multi_index_container<...> >等结构?

一方面,我们有private: BOOST_COPYABLE_AND_MOVABLE(multi_index_container) 在容器声明中。它应该告诉我们不要把multi_index_container&lt;&gt;进入其他类似stl的容器。

另一方面,这种结构

QMap< QString, boost::multi_index_container<...> > _map;
map.insert("bla-bla", container1);
...
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
//keyVal corresponds to one for the multi_index_container instance
使用Visual Studio 2012编译

(+ update4 + boost v1.55 + qt v4.8.5)。

实验上发现:

auto tmp = _map.value(QString("bla-bla")).get<keyVal>();

使tmp处理已删除的数据。 而

auto tmp = _map.value(QString("bla-bla"));
auto tmp_1 = tmp.get<keyVal>();

tmp_1留下有效数据。

如果我们需要将它放在另一个容器中,是否有人知道boost::multi_index_container<>的正确治疗方法是什么?

Qt5.3有什么不同吗?

3 个答案:

答案 0 :(得分:3)

正如你在QMap的文档中看到的那样:

const T QMap::value(const Key & key, const T & defaultValue = T()) const

该值按值返回,而不是按引用返回。除了对大值(例如多索引容器,可能?)效率非常低之外,它还会返回一个临时值。

现在,get<keyVal>();确实返回对第一个索引的引用,它是属于临时索引的索引,在临时索引结束时死亡表达


要获得可修改的参考,请使用

T & QMap::operator[](const Key & key)

现在你可以:

auto& tmp = _map[QString("bla-bla")].get<keyVal>();

请注意 &

答案 1 :(得分:1)

添加@sehe关于如何检索引用而不是临时值的答案,boost::multi_index_container copyable and movable。您引用的此BOOST_COPYABLE_AND_MOVABLE宏必须放在类私有部分(如指定here),但这不会影响复制/移动ctors的可见性。故事的道德:在深入研究代码之前咨询文档。

答案 2 :(得分:-4)

在我的特定情况下,问题是编译器使用const T operator[](const Key & key) const而不是T & operator[](const Key & key),因为类的方法是const,并且地图是类的字段。