对于对象的映射,我可以放置对象,或者只是成对
For a map of objects, can I emplace objects, or just pairs?
我使用c++ 11和gcc-4.7.0。我正在寻找一个STL解决方案。
我想有一个未排序的multimap,包含myClass的对象与短字符串作为键。Emplace看起来是一种将物体放入地图的好方法,但我不确定它是否能做到这一点,或者它是否只会构建键/对象对。这应该是有效的:
table.emplace(myKey, myClass(arg1, arg2, arg3));
但是这样做会更有效率吗?它是有效的代码吗?
table.emplace(myKey, arg1, arg2, arg3);
由此可见,gcc-4.7
不完全支持emplace()
。
gcc-4.8
将完全支持emplace()
,但需要稍微不同的语法:
table.emplace(std::piecewise_construct, std::forward_as_tuple(myKey), std::forward_as_tuple(arg1, arg2, arg3));
代替
table.emplace(myKey, arg1, arg2, arg3); // Does not work.
要使forward
对右值生效,可以使用std::move()
将参数括起来。
所以它会在容器中直接构造key和value。
std::piecewise_construct
是std::pair
构造函数特殊用法的参数。它将要求构造函数将参数单独转发给底层构造函数。
这实际上是关联容器的emplace()
问题。最初的意图是使用第一个参数作为key,接下来的参数作为value,就像问题中描述的那样。有关此问题的详细信息,请参阅此。
感谢Zeta指出forward
问题
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- C 中的堆是否包含类和结构对象,或者仅包含指针
- 我想在C++中创建内部类的对象,或者可能是嵌套类
- 哪种设计更好:提供对所属对象的直接访问,或者为所属对象提供所属对象转发方法
- c++中的RVO和查询结果作为对象,或者如果涉及委派,最好通过引用传递
- Q等待条件,手动复位除外?(或者在Qt Concurrent之外创建QFuture对象?)
- 如何在OpenGL中将对象旋转一定程度?有内置的命令吗?或者我必须使用公式吗
- 我必须创建一个对象来调用类方法吗?或者我可以只键入类名吗
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 我是否应该保留随机分布对象实例,或者我可以总是重新创建它
- dynamic_cast是否检查被查询对象的type_info对象,或者递归地检查
- std::vector *必须*在增加容量时移动对象吗?或者,分配器可以"reallocate"吗?
- 是否可以在全局对象构造函数中进行打印/日志记录,或者这是一种未定义的行为?
- 指向对象的指针没有任何值(或者没有得到值)
- 如何(或者我可以安全地,或者我可以)移动const对象
- 对于对象的映射,我可以放置对象,或者只是成对