重载<< c ++ stl容器的运算符

时间:2012-02-16 22:06:02

标签: c++ stl ofstream

我希望我可以通过使用cout<<来打印集合/矢量/地图的内容。对于stl设计者来说,实现它似乎并不困难:假设<<定义为T,<<对于容器,可以遍历元素并使用ofstream<<<<<

是否有一种简单的方法来打印我不知道的?

如果没有,是否有一个简单的解决方案?我已经阅读过扩展stl类的地方是一个坏主意。是这样,为什么?

如何定义类似重载打印功能的东西? 编辑: 我正在寻找一个递归功能,可以处理容器的容器...... 我同意不同的人会喜欢不同的格式,但是可以覆盖的东西比什么都没有好

5 个答案:

答案 0 :(得分:3)

输出STL容器的最简单方法可能是

std::copy(cont.begin(), cont.end(),
          std::ostream_iterator<Type>(std::cout, " "));

其中Typecont元素的类型(例如,如果cont属于std::vector<int>类型,则Type必须为int )。

当然,您可以使用任何ostream代替std::cout

答案 1 :(得分:2)

在C ++ 11中,您可以使用基于范围的for

for (auto& i: container)  cout << i << "  ";
cout << endl;

答案 2 :(得分:2)

转储容器最简单的方法可能只是使用std::copy()。例如,我通常使用这样的东西:

template <typename C>
std::string format(C const& c) {
    std::ostringstream out;
    out << "[";
    if (!c.empty()) {
        std::copy(c.begin(), --c.end(),
            std::ostream_iterator<typename C::value_type>(out, ", "));
            out << c.back();
    }
    out << "]";
    return out.str();
}

是的,这并不总是有效,但能满足我的需求。这实际上显示了标准库中没有容器输出的问题之一:容器的格式化方式有很多种。更糟糕的是,格式化的输出应该是可读的,而事情变得真正有趣。所有这些都是可行的,但我不知道相应的提案。

答案 3 :(得分:0)

  

对于stl设计者来说,实现起来并不困难:假设&lt;&lt;定义为T,&lt;&lt;对于容器,可以遍历元素并使用ofstream&lt;&lt;&lt;&lt;&lt;

当然对他们来说并不难。但是,问问自己:输出的格式对每个客户都有意义吗?标准库是关于重用和通用性的。将容器与一些任意输出格式化规则耦合使得它们不那么通用,仅为了一些。

因此,推荐的解决方案是提供您自己的operator<<(std::ostream &, T)和/或采用其他通用算法,例如, <algorithms>

答案 4 :(得分:0)

您在找这样的东西吗?

#include <iostream>
#include <set>

template <typename T>
std::ostream& operator<< (std::ostream& os, const std::set<T>& s)
{
    for( auto i: s ) {
        os << i << " ";
    }
    return os;
}

那么您就可以这样使用它:

std::set<int> my_set = { 11, 12, 13 };

std::cout << my_set << std::endl;