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:请每个问题问一个问题。也许把你的第二个问题作为一个新问题发布。不工作是一个不具体的描述。我不是一个读心术的人,这里的代码是为了演示这种方法,即使用不同于运算符的函数