unordered_map of std::ofstream
unordered_map of std::ofstream
我想使用std::unordered_map<unsigned,std::ofstream>
但失败了。现在我想知道这是否根本不可能,或者编译器问题,或者我只是没有做对。问题是插入了另一个元素:
std::ofstream&get(unsigned key, std::unordered_map<unsigned,std::ofstream>&map)
{
auto file = map.find(key);
if(file==map.end()) {
map.emplace(std::make_pair(key,std::ofstream{})); // <-- trouble here
file = map.find(key);
assert(file!=map.end());
}
return file->second;
}
使用 GCC (4.8.1) 失败,因为std::ofstream
不可复制构造。
但是,它是可移动构造的,所以应该有一个解决方案,还是没有?(我只想插入一个默认构造的std::ofstream
)。我试图添加有些std::move()
,但这没有帮助。
我刚刚注意到上面的代码确实使用 clang 3.4 编译。这不是错吗?
你先做一对,然后要求map再次构造这对并导致问题
尝试
map.emplace(key,std::ofstream{});
实际上,您所需要的只是
std::ofstream&get(unsigned key, std::unordered_map<unsigned,std::ofstream>&map)
{
return map[key];
}
或删除此功能...并使用map[key]
因为如果使用不存在的键,map 将使用默认构造函数构造ofstream
,所以它应该像你的代码一样工作
它与 GCC 编译器无关,也可能与所有其他编译器无关,basic_fstream提供了相当简单的操作,在此文件流之上没有复制操作。解决方案是,如果您希望两个名称引用同一个文件流,请使用引用或指针或操作文件流。
STL经常使用copy,上面用emplace
或make_pair
使用copy。insert()
更方便的符号.这m[k]
的结果等价于(*(<map>.insert(make_pair(k,V{})).first)).second
的结果,其中V
是映射的类型,所以那里没有移动。
移动和复制的细微区别是,复制后两个对象必须具有相同的值,而在移动后,源移动不需要具有其原始值。可以使用移动当源对象不再使用时。他们特别对于实现移动资源的概念很有用。对于最有趣的情况,容器(移自状态)为"空"。
复制或移动对象有五种情况:• 作为作业的来源• 作为对象初始化器• 作为函数参数• 作为函数返回值• 作为例外在所有情况下,都将应用复制或移动构造函数(除非它可以优化)。
估计在当前标准中适应这一点的机会微乎其微,这还没有结束前面提到的,在你的情况下,你能不能使用指向 ofstream 的指针?
unordered_map<int, ofstream*> map1;
map1.emplace(1, new ofstream());
您对其他使用 move 的编译器有任何想法吗?
- std::ofstream 作为类成员删除复制构造函数?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 使用 auto_ptr<std::ofstream> 对象
- 当 ofstream 指针位于 std::map 中时,文件写入不会发生 C++.
- 如何将 std::ofstream& 传递给函数参数?
- 派生 std::ofstream 和重载运算符<<
- 为什么我可以在临时 std::ofstream 对象上使用"operator<<"?
- 如何在 std::ofstream 和 std::cerr 之间切换
- 为什么将字符串输出到未命名的 std::ofstream 反而给了我一个十六进制数?
- 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?
- 将 boost stream_buffer 与 std::ofstream 结合使用
- 对 std::ofstream 进行空文件检查
- 将 std::ofstream 对象作为参数传递给类方法
- 为什么 std::ofstream 会在没有 std::ios_base::trunc 的情况下截断?
- std :: ofstream,覆盖错误的文件行
- std :: ofstream-没有比1023(即时冲洗)更长的缓冲字符串
- 如何超载std :: ofstream :: put()
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- std::ofstream 会自动在 之后添加回车符 (CR; \r)
- 为什么 getline() 在 C++ 中不起作用?(调用'getline(std::ofstream&, std::string&)'没有匹配函数