【问题标题】:Pretty-print a std::vector in C++ [duplicate]在 C++ 中漂亮地打印 std::vector [重复]
【发布时间】:2013-03-15 14:45:44
【问题描述】:

如何漂亮地打印std::vector?例如,如果我构造了一个std::vector<int>(6, 1),我可以通过什么运行它来获得像 C++ 中的{1 1 1 1 1 1} 这样的输出?它需要是通用的,因为大小和值可能会发生变化,因此 std::vector<int>(4, 0) 将是 {0 0 0 0}

【问题讨论】:

  • 什么意思?您只想将向量中的元素打印为特定格式?
  • 使用流来打印它们?
  • 在控制台屏幕中显示?到目前为止你有任何代码吗?
  • 是在控制台屏幕中以特定格式打印元素。我只需要一个想法如何去做,我可以自己构建代码
  • 我会调查可能的重复答案。为重复道歉。

标签: c++ stdvector


【解决方案1】:
#include <vector>
#include <algorithm>
#include <iterator>

template<typename T>
std::ostream & operator<<(std::ostream & os, std::vector<T> vec)
{
    os<<"{ ";
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(os, " "));
    os<<"}";
    return os;
}

然后您可以使用正常的operator&lt;&lt; 语法输出您的向量:

std::cout<<yourVector;

你可以在here看到这个。

但对于更灵活的解决方案,请查看question linked above


编辑:如果您不想要两个空格(开头和结尾):

template<typename T>
std::ostream & operator<<(std::ostream & os, std::vector<T> vec)
{
    os<<"{";
    if(vec.size()!=0)
    {
        std::copy(vec.begin(), vec.end()-1, std::ostream_iterator<T>(os, " "));
        os<<vec.back();
    }
    os<<"}";
    return os;
}

【讨论】:

  • 请注意,这不会产生 OP 请求的输出,因为它将有一个尾随分隔符:{0 0 0 0 }(如果重要的话)。
  • C&P'ing 可能是一个错字/遗漏,但如果您将操作员模板化为任意 T,则您不需要 ostream_iterator&lt;int&gt;
  • @us2012:正确,已修复。
  • @BjörnPollex:你是对的,出于某种原因,我一直认为ostream_iterator 可以解决这个问题。好吧,我将在开头添加一个空格以使其对称。 :)
  • @MatteoItalia:这就是为什么我只使用空格或换行符作为分隔符的原因,因为它实际上对其他任何东西都没用。另一方面,如果向量不为空,则添加检查,然后复制到--vec.end() 并在额外步骤中打印最后一项。
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2011-09-08
  • 2011-05-27
  • 2011-10-29
  • 2017-05-01
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多