pank Asked:2020-03-15 18:21:58 +0000 UTC2020-03-15 18:21:58 +0000 UTC 2020-03-15 18:21:58 +0000 UTC 为什么 ostream 的 << 运算符没有为容器超载? 772 为什么 for 运算符不会为, ,之类的容器<<超载?ostreamvectorsetmap <<如果运算符重载for存在问题ostream,那么为什么不添加一个函数printor print_container,它可以输出容器。 出于好奇,我问得更多,因为我必须自己实现这样的小事。而且,在许多其他语言中显示容器并不困难。 c++ 4 个回答 Voted Best Answer Harry 2020-03-15T18:38:31Z2020-03-15T18:38:31Z 告诉我如何正确显示vector<int>- 用逗号分隔?具有固定的字段宽度?也许把所有东西都放在括号里? vector<string>字符串需要用引号括起来吗?或不? 并且list<double>- 以何种准确性和以何种格式推断? 请注意,这不是为您自己决定的,而是为所有C++ 程序员决定的…… 你准备好迎接这样的圣战了吗? 写下你自己的结论是几秒钟的事情。好吧,至少写 copy(c.begin(),c.end(),ostream_iterator<int>(cout,",")):-) “我认为是”(c)维尼 Vlad from Moscow 2020-03-15T18:55:10Z2020-03-15T18:55:10Z 首先,容器是由很多元素组成的,所以不清楚容器元素以什么格式显示。例如,您可以在新行上显示每个元素。您可以在一行中显示所有元素,以空格分隔。您可以在一行中显示所有元素,用逗号或分号等分隔。 其次,容器不仅可以包含基本类型,还可以包含用户创建的类型。在这种情况下,通常不可能提前预测容器元素的输出应该是什么样子。 所以它真的归结为运算符重载来输出容器元素本身。用户创建的类型的运算符重载是用户的责任。有了这样一个重载的运算符,显示容器的所有元素并不困难。此外,还有几种这样的方法:您可以使用标准算法,例如std::copy和std::copy_if其他算法。或者您可以使用常规循环:for, while, do-while。或者使用基于范围的循环。此外,您还可以设置选择元素以从容器输出的条件。 对于其他语言,这个问题通常通过所有对象都继承自一个具有虚(或非虚)函数toString(或ToString)的基对象这一事实来解决。也就是说,用户创建的任何对象都默认具有输出到流的功能。或者正在创建的新对象已经有一些最小的接口,其中还包括将对象转换为字符串的功能。 在 C++ 中,不存在所有其他对象都源自的单个对象,因此没有预定义的函数可以将任意对象转换为可以流式传输的字符串。 Cerbo 2020-03-15T18:55:00Z2020-03-15T18:55:00Z 没有技术问题。对于定界符、括号和其他装饰,没有什么能阻止您添加与整数类型相同的修饰符。实现可能如下所示: template<typename T> std::ostream & operator << ( std::ostream & printer , const std::vector<T> & items ) { printer << std::begin_scope(); std::copy( items.begin() , items.end () , std::ostream_iterator<T>( printer , std::delimeter()) ); printer << std::end_scope(); return printer; } 在 I/O 方面,我们仅在 C++ 中重现了标准 C 库的功能 :) 假设程序员自己会根据需要手动编写。 Malov Vladimir 2020-03-16T05:28:39Z2020-03-16T05:28:39Z 我认为在标准容器中实现输出到流的问题比选择输出格式和分隔符要严重得多。假设 << 运算符是为 STL 容器实现的。当然,你能想到的最简单的事情就是它绕过所有项,并使用相同的 << 运算符将它们放入输出流中。因此,对容器中使用的所有类型的合理要求 - 流的输出运算符的存在。同意,不太灵活
告诉我如何正确显示
vector<int>- 用逗号分隔?具有固定的字段宽度?也许把所有东西都放在括号里?vector<string>字符串需要用引号括起来吗?或不?并且
list<double>- 以何种准确性和以何种格式推断?请注意,这不是为您自己决定的,而是为所有C++ 程序员决定的……
你准备好迎接这样的圣战了吗?
写下你自己的结论是几秒钟的事情。好吧,至少写
copy(c.begin(),c.end(),ostream_iterator<int>(cout,",")):-)“我认为是”(c)维尼
首先,容器是由很多元素组成的,所以不清楚容器元素以什么格式显示。例如,您可以在新行上显示每个元素。您可以在一行中显示所有元素,以空格分隔。您可以在一行中显示所有元素,用逗号或分号等分隔。
其次,容器不仅可以包含基本类型,还可以包含用户创建的类型。在这种情况下,通常不可能提前预测容器元素的输出应该是什么样子。
所以它真的归结为运算符重载来输出容器元素本身。用户创建的类型的运算符重载是用户的责任。有了这样一个重载的运算符,显示容器的所有元素并不困难。此外,还有几种这样的方法:您可以使用标准算法,例如
std::copy和std::copy_if其他算法。或者您可以使用常规循环:for,while,do-while。或者使用基于范围的循环。此外,您还可以设置选择元素以从容器输出的条件。对于其他语言,这个问题通常通过所有对象都继承自一个具有虚(或非虚)函数
toString(或ToString)的基对象这一事实来解决。也就是说,用户创建的任何对象都默认具有输出到流的功能。或者正在创建的新对象已经有一些最小的接口,其中还包括将对象转换为字符串的功能。在 C++ 中,不存在所有其他对象都源自的单个对象,因此没有预定义的函数可以将任意对象转换为可以流式传输的字符串。
没有技术问题。对于定界符、括号和其他装饰,没有什么能阻止您添加与整数类型相同的修饰符。实现可能如下所示:
在 I/O 方面,我们仅在 C++ 中重现了标准 C 库的功能 :) 假设程序员自己会根据需要手动编写。
我认为在标准容器中实现输出到流的问题比选择输出格式和分隔符要严重得多。假设 << 运算符是为 STL 容器实现的。当然,你能想到的最简单的事情就是它绕过所有项,并使用相同的 << 运算符将它们放入输出流中。因此,对容器中使用的所有类型的合理要求 - 流的输出运算符的存在。同意,不太灵活