重载<<运算符打印矢量的前n个值(不是整个矢量)

时间:2017-01-28 09:30:50

标签: 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 == 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向量)?

2 个答案:

答案 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 << ']';
}