是否需要为容器编写打印功能?

时间:2011-10-21 22:23:33

标签: c++

我使用了大约6个不同的C ++容器。我开始编写打印功能来输出容器内容。这有必要吗?我认为这是C ++库的一部分吗?

  void print_list(const list<int>& list_int)
    {
    for (list<int>::const_iterator it = list_int.begin(); it != list_int.end(); it++) cout << *it << " ";
    }
  void print_um(const unordered_map<int, double>& map_int_d)
    {
    for(unordered_map<int, double>::const_iterator it = map_int_d.begin(); it != map_int_d.end(); ++it)cout << "[" << it->first << "," << it->second << "] ";
    }

3 个答案:

答案 0 :(得分:4)

它不是库的一部分,但使用提供的工具很容易编写:

C c; // Where C is a container type
std::copy(
    c.begin(), c.end()
  , std::ostream_iterator< C::value_type >( cout, " " )
);

对于元素为pair的容器(如map,我相信unordered_map),您需要一个自定义输出迭代器来打印pair逗号和括号。

答案 1 :(得分:2)

您在问题中提供的代码有一个提示,说明为什么它不是标准库的一部分。您的代码使用方括号和逗号,没有空格来显示地图中的对。其他人可能希望它的格式不同,所以标准委员会的选择是:

  1. 提供大量格式选项。
  2. 不提供任何格式选项,并让不喜欢其格式的每个人都自己动手。
  3. 什么都不做,让每个人都自己动手
  4. 他们选择了三个,因为他们知道可以开发满足人们特定需求的图书馆。

答案 2 :(得分:1)

怎么样:

#include <iostream>
#include <map>
#include <algorithm>

template <typename K, typename V>
    std::ostream& operator<<(std::ostream& os, const std::pair<K,V>& p)
{
    return os << "[" << p.first << ", " << p.second << "]";
}

template <typename Container>
    std::ostream& operator<<(std::ostream& os, const Container& c)
{
    std::copy(c.begin(), c.end(), 
        std::ostream_iterator<typename Container::value_type>(os, " "));
    return os;
}

你可能也对Boost Spirit Karma:

感到迷惑
#include <boost/spirit/include/karma.hpp>

using boost::spirit::karma::format;
using boost::spirit::karma::auto_;

int main()
{
     std::vector<int> ints(1000);
     std::map<std::string, int> pairs();

     // ...

     std::cout << format(auto_ % " ", ints) << std::endl;
     std::cout << format(('[' << auto_ << ',' << ']') % " ", pairs) << std::endl;
}