RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 639789
Accepted
pank
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 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. 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)维尼

    • 12
  2. Vlad from Moscow
    2020-03-15T18:55:10Z2020-03-15T18:55:10Z

    首先,容器是由很多元素组成的,所以不清楚容器元素以什么格式显示。例如,您可以在新行上显示每个元素。您可以在一行中显示所有元素,以空格分隔。您可以在一行中显示所有元素,用逗号或分号等分隔。

    其次,容器不仅可以包含基本类型,还可以包含用户创建的类型。在这种情况下,通常不可能提前预测容器元素的输出应该是什么样子。

    所以它真的归结为运算符重载来输出容器元素本身。用户创建的类型的运算符重载是用户的责任。有了这样一个重载的运算符,显示容器的所有元素并不困难。此外,还有几种这样的方法:您可以使用标准算法,例如std::copy和std::copy_if其他算法。或者您可以使用常规循环:for, while, do-while。或者使用基于范围的循环。此外,您还可以设置选择元素以从容器输出的条件。

    对于其他语言,这个问题通常通过所有对象都继承自一个具有虚(或非虚)函数toString(或ToString)的基对象这一事实来解决。也就是说,用户创建的任何对象都默认具有输出到流的功能。或者正在创建的新对象已经有一些最小的接口,其中还包括将对象转换为字符串的功能。

    在 C++ 中,不存在所有其他对象都源自的单个对象,因此没有预定义的函数可以将任意对象转换为可以流式传输的字符串。

    • 4
  3. 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 库的功能 :) 假设程序员自己会根据需要手动编写。

    • 3
  4. Malov Vladimir
    2020-03-16T05:28:39Z2020-03-16T05:28:39Z

    我认为在标准容器中实现输出到流的问题比选择输出格式和分隔符要严重得多。假设 << 运算符是为 STL 容器实现的。当然,你能想到的最简单的事情就是它绕过所有项,并使用相同的 << 运算符将它们放入输出流中。因此,对容器中使用的所有类型的合理要求 - 流的输出运算符的存在。同意,不太灵活

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5