c++ - 为什么不能接受开始和结束作为参数
问题描述
我正在为我的团队开发一个基本(低级)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
接受参数传递给序列中包含的元素的构造函数。在这种情况下,它是 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'));
推荐阅读
- c - 我在接收 C 中的按键时遇到问题
- mysql - docker内部的django-mysql连接错误
- sql-server - Power BI 查询错误:Microsoft SQL:';' 附近的语法不正确。')' 附近的语法不正确
- javascript - 从javascript对象literel返回值
- postgresql - psql 身份验证失败并显示 --host=localhost
- javascript - 未捕获的类型错误:无法读取未定义的属性“1”(即使已定义)
- android - Android gradle 同步:无法获取资源 firebase-measurement-connector-impl-17.0.4-javadoc.jar
- javascript - useReducer/useState 更新太慢
- python - 为什么我们在运行 subprocess.check_output(xyz, shell=True) 后会从终端丢失标准输出?
- python - Python:从弧线创建路线