Pretty-print a std::vector in C++
我怎样才能漂亮地打印一个std::vector?例如,如果我构造一个EDCOX1,1,那么,在C++中,我可以运行它以获得像EDCOX1 2?它必须是通用的,因为大小和值可能会改变,所以std::vector(4, 0)将是{0 0 0 0}。
- 什么意思?您只想将矢量中的元素打印成特定的格式?
- 使用流打印它们?
- 在控制台屏幕上显示?到目前为止你有密码吗?
- 是在控制台屏幕中以特定格式打印元素。我只需要一个关于如何去做的想法,我可以自己构建代码。
- 我会调查可能的重复答案。为复制品道歉。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <vector>
#include
#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<<语法输出向量:
你可以在这里看到这一点。
但对于更灵活的解决方案,请看上面链接的问题。
编辑:如果不需要这两个空格(开头和结尾):
1 2 3 4 5 6 7 8 9 10 11 12
| 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。
- @US2012:正确,固定。
- @你是对的,出于某种原因,我一直认为ostream_iterator会处理好这件事。好吧,我在开始的时候加一个空间,使它对称。:)
- @Matteoitalia:这就是为什么我只使用空格或换行符作为分隔符的原因,因为它实际上对其他任何东西都没有用处。另一方面,如果向量不为空,则添加一个检查,然后复制到--vec.end()并在额外的步骤中打印最后一项。
- 我有一个问题,有时值std::vector(4,0)出于某种原因存储在字符串中。与str="std::vector(4,0)"类似,并按原样显示在数据库中。但我想将其显示为0 0 0 0是否可以对这些情况进行某种类型转换??
- @ USE2020504:在C++中,你不能在运行时评估这种表达式;如果你真的需要这样的东西,你可以编写一种ad-hoc解析器,但是最好的解决方法是把向量存储在一些固定的、容易解析的格式中(就像我们在这里讨论的那样)。
- #使用命名空间std;int main()string str="std::矢量(6,0)";unununsignfound=str.find('(');char c=str[find+1];int i=c-'0';char ch=str[find+3];int j=ch-'0';str="";;for(int k=0;k
- 这能起作用,但看起来不太好。另外,我如何在这里发布它,以便它更可读。对不起的
- @用户2029504:为这个新问题创建另一个问题。
- 使用back()而不是last()。我已经建议编辑了。
- @谢谢,同意!