c++ - 重载 << 运算符以打印 vector 的前 n 个值(不是整个 vector )

标签 c++ templates operator-overloading

下面的代码可以用来打印 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/

相关文章:

c++ - 在关闭 C++ 程序之前删除链表?

c++ - 从派生类方法设置基对象

c++ - 为什么当我们将 lambda 发送到 std::function 时,自动模板类型推导不起作用?

ios - Swift:在另一种类型上使用重载的 == 运算符

c++ - 是否有 Qt 对话框或小部件以交互方式对字符串列表进行排序?

c++在转换中为多数组错误添加值(value)

c++ - 是否可以为模板提供可变参数列表或根据提供的参数列表自动生成规范

c++ - 函数模板和缩写函数模板之间的等价关系

C# - 无法覆盖 ==

c++ - 重载运算符问题 C++