-1

是否可以使用类似的结构QMap< QString, boost::multi_index_container<...> >

一方面,我们private: BOOST_COPYABLE_AND_MOVABLE(multi_index_container) 在容器中声明。它应该告诉我们不要将 multi_index_container<> 放入其他类似 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 有什么不同吗?

4

3 回答 3

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>();

注意&.

于 2014-10-07T17:21:13.573 回答
1

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

于 2014-10-08T07:03:41.373 回答
-4

在我的特殊情况下,问题是编译器使用const T operator[](const Key & key) const而不是T & operator[](const Key & key)因为类的方法是const一个,而映射是类的一个字段。

于 2014-10-08T07:44:52.887 回答