根据 文件 它:
插入一个由对象构造的对象 参数args,在容器中 当且仅当没有元素时 具有等效键的容器。
但是可以插入到unordered_map中的唯一对象具有类型 std::pair<Key const, Mapped>
(因为要插入的对象需要一个键和一个值),已知这个构造函数只有两个参数。那么为什么它使用可变函数形式呢?当然,我完全不了解这一点。
根据 文件 它:
插入一个由对象构造的对象 参数args,在容器中 当且仅当没有元素时 具有等效键的容器。
但是可以插入到unordered_map中的唯一对象具有类型 std::pair<Key const, Mapped>
(因为要插入的对象需要一个键和一个值),已知这个构造函数只有两个参数。那么为什么它使用可变函数形式呢?当然,我完全不了解这一点。
看到 这个 有关emplace_back与push_back的文章。本质上,它允许从传递给它的参数构造一个对象,而不需要首先创建要传递的对象。它通过删除通常由于创建要插入的对象而发生的复制结构来节省开销。
所以你可以逃脱这个:
unordered_map<int,int> foo;
foo.emplace(4, 5);
代替
foo.insert(std::make_pair(4, 5));
更好的,(如果我没有记错的话),你可以通过这条路线:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
并取自维基 的C ++ 0x:
由于rvalue引用的措辞的性质,以及对左值引用(常规引用)的措辞的一些修改,rvalue引用允许开发人员提供完美的函数转发。当与可变参数模板结合使用时,此功能允许功能模板可以完美地将参数转发给另一个采用这些特定参数的函数。这对于转发构造函数参数,创建工厂函数非常有用,这些函数将自动为这些特定参数调用正确的构造函数。
其工作方式如下:
template<typename TypeToConstruct> struct SharedPtrAllocator {
template<typename ...Args> std::shared_ptr<TypeToConstruct> construct_with_shared_ptr(Args&&... params) {
return std::shared_ptr<TypeToConstruct>(new TypeToConstruct(std::forward<Args>(params)...));
}
}
再次,从上面提到的Wiki文章中无耻地窃取。
看到 这个 有关emplace_back与push_back的文章。本质上,它允许从传递给它的参数构造一个对象,而不需要首先创建要传递的对象。它通过删除通常由于创建要插入的对象而发生的复制结构来节省开销。
所以你可以逃脱这个:
unordered_map<int,int> foo;
foo.emplace(4, 5);
代替
foo.insert(std::make_pair(4, 5));
更好的,(如果我没有记错的话),你可以通过这条路线:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
并取自维基 的C ++ 0x:
由于rvalue引用的措辞的性质,以及对左值引用(常规引用)的措辞的一些修改,rvalue引用允许开发人员提供完美的函数转发。当与可变参数模板结合使用时,此功能允许功能模板可以完美地将参数转发给另一个采用这些特定参数的函数。这对于转发构造函数参数,创建工厂函数非常有用,这些函数将自动为这些特定参数调用正确的构造函数。
其工作方式如下:
template<typename TypeToConstruct> struct SharedPtrAllocator {
template<typename ...Args> std::shared_ptr<TypeToConstruct> construct_with_shared_ptr(Args&&... params) {
return std::shared_ptr<TypeToConstruct>(new TypeToConstruct(std::forward<Args>(params)...));
}
}
再次,从上面提到的Wiki文章中无耻地窃取。
既然C ++标准库集成了Boost的那部分:
#include <iostream>
#include <utility>
#include <tuple>
#include <unordered_map>
int main(){
std::unordered_map<std::string, std::string> m;
// uses pair's piecewise constructor
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));
for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}
std::piecewise_construct