我希望我可以通过使用cout<<来打印集合/矢量/地图的内容。对于stl设计者来说,实现它似乎并不困难:假设<<定义为T,<<对于容器,可以遍历元素并使用ofstream<<<<<
是否有一种简单的方法来打印我不知道的?
如果没有,是否有一个简单的解决方案?我已经阅读过扩展stl类的地方是一个坏主意。是这样,为什么?
如何定义类似重载打印功能的东西? 编辑: 我正在寻找一个递归功能,可以处理容器的容器...... 我同意不同的人会喜欢不同的格式,但是可以覆盖的东西比什么都没有好
答案 0 :(得分:3)
输出STL容器的最简单方法可能是
std::copy(cont.begin(), cont.end(),
std::ostream_iterator<Type>(std::cout, " "));
其中Type
是cont
元素的类型(例如,如果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;