C++11 可以用std::map处理std::of流吗?

C++11 可以用std::map处理std::of流吗?,c++11,stdmap,C++11,Stdmap,“”说不,一个人应该使用std::map,但这会导致new和delete操作,这不是很整洁 既然“是!”并且可以“”,那么是否可以使用std::map处理流的集合?这样就不用担心关闭文件流和delete来释放内存 我可以妥协,在使用std::map时,只创建、使用(用于写入)和关闭,而不是复制它。是的,这是可能的。请参见下面的示例代码 在使用std::map的过程中,只能创建、使用(用于写入)和关闭,而不能复制它 它们是不可复制的,所以在你的最后评论中,你是正确的,你将无法复制它。如果你想做的话

“”说不,一个人应该使用
std::map
,但这会导致
new
delete
操作,这不是很整洁


既然“是!”并且可以“”,那么是否可以使用
std::map
处理流的
集合?这样就不用担心关闭文件流和
delete
来释放内存


我可以妥协,在使用
std::map
时,只创建、使用(用于写入)和关闭,而不是复制它。

是的,这是可能的。请参见下面的示例代码

在使用
std::map
的过程中,只能创建、使用(用于写入)和关闭,而不能复制它

它们是不可复制的,所以在你的最后评论中,你是正确的,你将无法复制它。如果你想做的话,你可以移动分配

#include <iostream>
#include <fstream>
#include <map>

int main()
{
    std::map<std::string, std::ofstream> map;
    map.emplace("foo", std::ofstream("/tmp/foo"));
    map.emplace("bar", std::ofstream("/tmp/bar"));

    map["foo"] << "test";
    map["foo"].flush();

    std::ifstream ifs("/tmp/foo");
    std::string data;
    ifs >> data;

    std::cout << data << '\n';

    return 0;
}
#包括
#包括
#包括
int main()
{
地图;
地图安放(“foo”,标准::流(“/tmp/foo”);
地图安放位置(“酒吧”,标准::流(“/tmp/酒吧”);
地图[“foo”]>数据;

std::cout“这样就不用担心关闭文件流和删除以释放内存”。这就是智能指针的用途(如果移动语义不适合您,或者您需要多态流)。但ofstream本身也会这样做,对吗?如果映射超出范围,将调用其析构函数,这将再次调用所有元素的析构函数,即ofstream的析构函数,然后所有文件都将正确关闭。您可以省略移动操作,此代码将构造ofstream对象并将其移动到std::map存储区。'map.emplace(“foo”,“/tmp/foo”);”将就地构造对象。