【问题标题】:Why doesn't std::to_string support container classes as input?为什么 std::to_string 不支持容器类作为输入?
【发布时间】:2019-01-21 00:33:20
【问题描述】:

因此 std::to_string 适用于各种原始类型。但是,当尝试像矢量一样打印容器的元素时,我必须逐个元素地遍历矢量元素并单独打印每个元素。现在授予,像向量这样的东西可以相当于一个语句或循环,如下所示:

for_each(v.begin(), v.end(), [](int x) {cout << x <<", "; });

但是对于其他容器类,格式化数据类型可能会很麻烦。

相比之下,Java 或 Python 等语言具有在单个语句中打印大多数容器的函数。为什么 STL 不接受这些作为 std::to_string 中的参数或将 to_string 实现为容器类的成员函数?

【问题讨论】:

  • 您展示的代码适用于任何容器。但请注意,它会在最后一个元素之后写一个逗号和一个空格。
  • 一个ostream_iterator 有助于解决尾随分隔符问题,顺便说一句。
  • to_string 应该以什么格式打印?一对方括号和一个逗号分隔的列表?像Json这样的东西?也许漂亮的印刷品?标准库旨在为尽可能广泛的应用程序提供实用程序。打印容器太小众了。根据自己的需要推出自己的解决方案并不难,因此不需要标准库解决方案。

标签: c++ stl


【解决方案1】:

Vector 不知道如何将自定义类转换为字符串,除非自定义类提供字符串转换。现在自定义类不需要提供字符串转换,因为它可能对该类的意义较小。

在这个意义上,容器是非常通用的。 就像你指出的那样,它很容易实现。非常典型的方式是重载&lt;&lt;操作符如下:

ostream& operator<<(ostream& cout, const vector<int>& sorted)
{
  cout << "Array => ";
  for( auto i : sorted ) {
    cout << i << ", ";
  }
  cout << endl;
  return cout;
}

或者使用stringstream类或者使用for_each ...

【讨论】: