遍历自定义地图并处理多个流

问题描述 投票:0回答:3

我是 C++ 的新手,并不是 100% 确定如何遍历映射。
对于该项目,我需要一个存储键的映射:[文件/流的名称] 和值:[logger::severity]。在文件名中可能有一个 ostream cout 的对象。

我几乎什么都没想到:

enum class severity
    {
        trace,
        debug,
        information,
        warning,
        error,
        critical
    };

std::map<std::ofstream, severity> this_loggers_streams;

for (std::map<std::ofstream, severity>::iterator iter = this_loggers_streams.begin(); 
          iter != this_loggers_streams.end(); ++iter) {
      iter->first << "" << std::endl;      
      }
}

我的 IDE 警告我,我的迭代器和无效操作数无法转换为二进制表达式('const std::basic_ofstream' 和 'const char[1]')。

如何遍历我的地图?什么是能够写入文件和 std::cout 的最佳解决方案,因为 std::cout 可能是我的地图的成员?

c++ iterator ofstream ostream
3个回答
0
投票

映射中的键是常量值。该代码无效,不更改软件设计就无法修复:

iter->first << "" << std::endl;  // iter->first is const std::ofstream

可能的变化:

std::list<std::pair<std::ofstream, severity>> this_loggers_streams;

0
投票

问题本质上不在于您如何遍历地图。标准容器旨在允许您使用特定对象(迭代器)迭代它们。在二叉搜索树而不是链表中迭代背后的逻辑不是你的问题。 您不应使用 std::ofstream 类型作为映射键,因为键是常量,因此无法更改(我认为您的意图是更改键)。另外,我不认为解决问题的最佳方法是使用二叉搜索树(如 std::map),也是因为按顺序迭代非常不利。此外,std::map 需要有一个内部比较对象,它将两个键作为参数并执行小于比较,因此您应该提供一个比较类来在两个 std::ofstream 对象之间执行此类比较。 您应该选择使用 std::list、std::forward_list(如果您只需要向前迭代)或 std::vector。


-2
投票

Map可以使用c++的foreach循环进行迭代。 例如:

std::map<int, int> mp;
for(auto i: mp){
    // use i.first to access key
    // use i.second to access value
}
© www.soinside.com 2019 - 2024. All rights reserved.