c++ - 为什么 C++ 标准库没有标准容器的流输出? (以及相关问题)

标签 c++

简单来说为什么 operator<< 没有过载的basic_ostream和标准容器如 vectorpair 。就像 string 一样.

如果有一种标准方法来打印这些对象,那就太容易了。


我很长一段时间想知道为什么这只是出于好奇(并且懒惰地为每个我想快速输出 vector 的小程序编写这样的运算符)。但现在我遇到了一个由此引起的真正的问题:

我正在实现一个库。我有一个异常类 utils::exception::OutOfRange 。构造函数将表示 key 的对象作为参数。那超出了范围。我用stringstream (和其他东西)创建(全面的)错误消息:

template <class Key>
inline OutOfRange::OutOfRange(const Key &key) : Exception(2) {
  //just the interesting part (a simplified version):
  string_stream message;
  message << "accessed at key/index '"<< key; // <-- there must be an operator<< for key
}

对于vector like containerkey可以是int所以一切都很好。对于map like container key可以是任何东西,但这要求必须有这样一个operator<< 。但强制用户拥有 operator<< 是有道理的。如果他想扔 OutOfRange目的。这样可以吗?

真正的困境来自于:现在我实现了 Matrix抛出 OutOfRange 的类(在同一库中) 。 Key因为这是 std::pair<int, int> 。所以我有责任提供一个operator<<对于 std::pair 。但包含定义 Matrix 的 header 似乎不太好。类也会(默默且无关地)带来 operator<<(ostream, std::pair) 的重载。 。如果用户也有这样的过载,则可能会出现冲突。

我觉得如果标准库中有这样的针对标准库中定义的容器的运算符,这一切都可以轻松避免。

我错过了什么吗?我创建消息的方法是否错误?

抱歉,如果我的问题遍布整个宫殿。我试图以一种全面且合乎逻辑的方式将它们联系在一起,不知道我成功了多少。

最佳答案

标准库不重载的原因operator<<对于容器来说很明显:用户对输出的期望有很大不同(单独考虑分隔符!对于 vector<int> ,空格或逗号可能很好,对于 vector<vector<int>> 换行符可能更好)。不存在“一个正确”的过载。这对于 std::string 当然是不同的它主要不被认为是一个容器,而是一个字符串。

对于你的第二个问题:你可能想重新考虑你的设计并只使用 std::out_of_range 。您还可以针对特定容器专门化您的模板,并使用专门的方法而不是 operator<< 执行打印。 .

另一种行之有效的打印范围的方法是使用 ostream 迭代器:

#include <iostream>     // std::cout
#include <iterator>     // std::ostream_iterator
#include <vector>       // std::vector
#include <algorithm>    // std::copy

int main () {
  std::vector<int> myvector;
  for (int i=1; i<10; ++i) myvector.push_back(i*10);

  std::ostream_iterator<int> out_it (std::cout,", ");
  std::copy ( myvector.begin(), myvector.end(), out_it );
  return 0;
}

(此示例代码复制自 cplusplus.com )

关于c++ - 为什么 C++ 标准库没有标准容器的流输出? (以及相关问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392063/

相关文章:

c++ - 数组作为数据成员

c++ - OpenGl 每 N 秒生成一个对象 "jump"

c++ - Cuda 三重嵌套 for 循环赋值

c++ - 请帮助我理解 C++ 中的 delete 运算符?

c++ - Opengl 程序示例崩溃

c++ - gsl::cstring_span 不支持 constexpr 吗?如果没有,我为什么要使用它?

c++ - 如何从其他类访问不同类中的变量

c++ - 您将如何在结构 vector 的 ROS 中发布消息?

c++ - Cuda:未执行的代码行减慢了程序

c++ - 在 float32 中保存 float16 最大数量