C++ 重载
下面的代码可以用来打印矢量内容C++ 重载,c++,templates,operator-overloading,C++,Templates,Operator Overloading,下面的代码可以用来打印矢量内容 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 == d
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;
}
但这是行不通的。那么,打印整个2d向量的正确方法是什么?和2一些n*m值不是整个2d向量,如第一个问题中所问的1d向量 您可以这样做:
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 << ']';
}
通常,操作员能够在随后从流读取时重构对象的副本
向量没有未使用值的概念,除非其元素有未使用值的概念。例如,对于std::vector,可以输出所有非空元素
例如,如果您希望在丢弃具有特定值的元素时输出std::vector的指定数量的元素,那么可以实现一个函数来实现这一点
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;
}
如果向量的大小为5000,则向量将存储5000个值。“向量中没有非值的概念。@Benjamin Lindley-在竞争性编程中,当有更多的测试用例时,我们用来声明最大输入大小的全局向量,但在大多数测试用例中,不使用整个向量。谢谢!”!但是2d向量该怎么办?@knock_out:请每个问题问一个问题。也许把你的第二个问题作为一个新问题发布。不工作是一个不具体的描述。我不是一个读心术的人,这里的代码是为了演示这种方法,即使用不同于运算符的函数