在C++中漂亮地打印一个std::vector

5
我该如何美化输出一个std::vector呢?例如,如果我构造一个std::vector<int>(6, 1),有什么方法可以让它输出像C++中的{1 1 1 1 1 1}这样的格式呢?由于大小和值可能会改变,因此需要是通用的,所以std::vector<int>(4, 0)应该输出为{0 0 0 0}

你的意思是什么?你想以特定格式打印向量中的元素吗? - taocp
使用流打印它们? - spiritwolfform
在控制台屏幕上显示?你已经有任何代码了吗? - Emmanuel N
是的,在控制台屏幕上以特定格式打印元素。我只需要一个思路,如何着手处理它,我可能可以自己构建代码。 - dharag
我会查看可能的重复答案。对于重复造成的不便,我深表歉意。 - dharag
1个回答

14
#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<< 语法输出向量:

std::cout<<yourVector;

你可以在这里看到它的实际效果。

但如果想要更灵活的解决方案,请查看上述链接中的问题


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

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}”(如果有必要)。 - Björn Pollex
@us2012:正确的,已修复。 - Matteo Italia
1
@BjörnPollex:你说得对,出于某种原因,我总是认为ostream_iterator会处理这个问题。好吧,我只需在开头加一个空格使其对称即可。 :) - Matteo Italia
3
这句话的意思是:“这就是为什么我只使用空格或换行符作为分隔符,因为它对其他任何东西来说实际上都是无用的。另一方面,您可以添加一个检查,如果向量不为空,然后只需复制直到--vec.end()并在额外步骤中打印最后一个项目。” - Björn Pollex
这样做可以完成工作,但不太美观。另外,我该如何发布它,以使其更易读。抱歉。 - dharag
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接