首页 > 解决方案 > 为什么不能接受开始和结束作为参数

问题描述

我正在为我的团队开发一个基本(低级)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);
}

标签: c++c++11stdmapemplace

解决方案


emplace接受参数传递给序列中包含的元素的构造函数。在这种情况下,它是 a std::pair<const Key, Value>,因此当您调用emplace您提供的参数时,将传递给 std::pair 的构造函数。由于两个迭代器不是有效的参数,它不会编译。

这些示例来自 cppreference,旨在让您了解 emplace 的实际使用方式:

std::map<std::string, std::string> m;

// uses pair's move constructor
m.emplace(std::make_pair(std::string("a"), std::string("a")));

// uses pair's converting move constructor
m.emplace(std::make_pair("b", "abcd"));

// uses pair's template constructor
m.emplace("d", "ddd");

// uses pair's piecewise constructor
m.emplace(std::piecewise_construct,
          std::forward_as_tuple("c"),
          std::forward_as_tuple(10, 'c'));

推荐阅读