下面的代码可以用来打印 vector 内容
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) 如果 vector 大小为 5000,并且只有前 n 个(比如 10 个)元素存储值而其他元素未被使用,那么如何修改此代码以仅打印前 n 个值?
2) 我尝试将 2d vector 打印为 -
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 vector 的正确方法是什么?和 2) 一些 n * m 值(不是第一个问题中针对 1d vector 提出的整个 2d vector )?
最佳答案
按照惯例,operator<<()
实现流式传输以输出重新创建完整对象所需的所有数据,因此 operator>>()
能够在随后从流中读取时重建对象的拷贝。
vector 没有“未使用”值的概念,除非它的元素有。例如,对于 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;
}
关于c++ - 重载 << 运算符以打印 vector 的前 n 个值(不是整个 vector ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908257/