【发布时间】:2021-08-14 04:19:50
【问题描述】:
我正在为我的团队开发一个基本(低级)c++11 库。现在我正在尝试开发一个自定义容器。
template<typename T1, typename T2>
class CustomMap {
public:
void insert(const std::map<T1, T2>& container) { mp_.insert(container.begin(), container.end()); }
void emplace(std::map<T1, T2>&& container) { mp_.emplace(container.begin(), container.end()); }
private:
std::map<T1, T2> mp_;
};
int main() {
CustomMap<int, int> mp;
std::map<int, int> mm;
mm[1] = 2;
mp.emplace(std::move(mm)); // ERROR
return 0;
}
std::map::emplace好像不能接受两个参数:开始和结束?
那么为什么std::map::insert 可以接受开始和结束但std::map::emplace 不能呢?
在我的代码的函数void emplace中,我必须使用循环吗?
for (auto && ele : container) {
mp_.emplace(ele);
}
【问题讨论】:
-
传递给
emplace的参数需要能够构造std::pair<const T1, T2>,因为它们只是直接转发到那里。insert特别有一个重载,允许您插入范围的内容,但emplace用于就地构造单个元素。 -
您所询问的功能值得一读。
-
@sweenish 我读过
std::map::emplace。但它并没有告诉我为什么它是这样设计的。为什么标准不使用两个迭代器类型的参数重载这个函数? -
简单的答案是,这不是函数的设计目的。你想要的并不在 emplace 的意图附近。你说你读过它,但它看起来根本不像。