下面的代码可用于打印矢量内容
template <class T>
ostream & operator << (ostream & out, const vector<T> & data)
{
out << "[";
for (int i = 0; i < (int) data.size(); ++i)
out << data[i] << (i == data.size() - 1 ? "" : ",");
out << "]";
return out;
}
问题:
1)如果矢量大小是5000并且只有前n个(比如说10个)元素存储值而其他元素没有使用那么如何修改这个代码只打印前n个值?
2)我试图将2d矢量打印为 -
template <class T>
ostream & operator << (ostream & out, const vector<vector<T>> & data)
{
out << "[";
for (int i = 0; i < (int) data.size(); ++i)
{
for ( int j = 0; j < (int) data[i].size(); ++j )
out << data[i][j] << (j == data[i].size() - 1 ? "" : ",");
out << endl;
}
out << "]";
return out;
}
但这不起作用。那么打印1)整个2d矢量的正确方法是什么?和2)一些n * m值(不是1d向量的第一个问题中提到的整个2d向量)?
答案 0 :(得分:1)
传统上,实现用于流式传输的operator<<()
以输出重新创建完整对象所需的所有数据,因此operator>>()
能够在随后从流中读取时重建对象的副本
向量没有“未使用”值的概念,除非其元素有。例如,对于std::vector<SomeType *>
,可以输出所有非NULL元素。
如果要在丢弃具有特定值的元素的同时输出指定数量的std::vector<std::vector<T> >
元素,则实现一个函数来执行此操作,例如;
template<template <class T>
std::ostream & OutputSubset (std::ostream & out, const vector<vector<T> > & data, std::size_t number, T discard)
{
if (number > data.size()) number = data.size();
for (std::size_t i = 0; i < number; ++i)
{
for (std::size_t j = 0; j < number; ++j)
if (data[i][j] != discard) out << ' ' << data[i][j];
out << '\n';
}
return out;
}
答案 1 :(得分:0)
您可以这样做:
std::vector<int> values = ...
std::cout << head(values, 10) << '\n';
如果您实施以下内容:
template <typename T>
struct HeadPrinter
{
HeadPrinter(const T& container, size_t count)
: _container(container), _count(count) {}
const T& _container;
size_t _count;
};
template <typename T>
HeadPrinter<T> head(const T& container, size_t count)
{
return HeadPrinter<T>(container, count);
}
template <typename T>
std::ostream& operator<<(std::ostream& out, const HeadPrinter<T>& printer)
{
size_t count = std::min(printer._count, printer._container.size());
out << '[';
for (size_t ii = 0; ii < count; ++i) {
out << printer._container[ii];
if (ii + 1 < count) {
out << ',';
}
}
return out << ']';
}