【问题标题】:Why can't I print an vector's begin() iterator?为什么我不能打印向量 begin() 迭代器?
【发布时间】:2021-03-10 12:02:00
【问题描述】:

所以,我只是在学习向量,我有 2 个问题。 第一个问题:

std::vector<int> c{1,2,3};
std::cout << c.begin();

我知道我应该在c.begin() 之前放一个* 来输出1,但是如果我不放指针符号,为什么std::cout 会给我一个错误?它不应该简单地输出c的第一个元素的地址吗?错误是“与运算符

【问题讨论】:

  • 请一次一个问题。关于第二个问题 - 不要考虑优化。没有人说这段代码应该是高效的。
  • 迭代器不是指针。

标签: c++ pointers iterator stdvector cout


【解决方案1】:

知道我应该在 c.begin() 之前放 '*' 以输出 1 ,但是如果我不放指针符号,为什么 cout 会给我一个错误?

因为编译器不知道如何“打印”c.begin() 类型的值。但是让我们读一下the error(GodBolt;使用 GCC),这很重要:

<source>:10:15: error: invalid operands to binary expression ('std::ostream'
(aka 'basic_ostream<char>') and 'std::vector<int, std::allocator<int> >::iterator' 
(aka '__normal_iterator<int *, std::vector<int, std::allocator<int> > >'))
    std::cout << c.begin();
    ~~~~~~~~~ ^  ~~~~~~~~~

换句话说:

我不知道如何应用&lt;&lt; 二元运算符,左侧有basic_ostream&lt;char&gt;,右侧有一个与std: 对应的“普通迭代器”:向量

因此,即使 std::vector&lt;int&gt; 的迭代器可能是一个简单的 int* - 不一定是这种情况:它可以是带有指针成员的类结构,也可以是指向向量开头的指针和整数偏移量等。语言标准 (AFAICR) 不保证此实现细节。

【讨论】:

  • @HeroForFun:实际上不是,请参阅编辑。无论如何 - 除非语言标准保证它是 - 你也不能对此做出假设。
  • 我还有一个关于向量的问题,你能帮帮我吗?我不想再发其他问题了
  • @HeroForFun:为什么让你感到困惑?也就是说,你为什么期望迭代器是int *
  • 当我创建向量时,会为其分配一些连续的地址,它将存储整数。当我执行 auto i = v.begin() 时,我认为 i 只是一个指向 int 数组开头的指针......它还能有什么其他类型?
  • @HeroForFun:例如,它可以是一个带有指针成员的结构。它可以有一个指向向量开头的指针和一个整数偏移值。这些是完全可用的。由于您是该语言的新手,因此您不能说“哦,但实现肯定不能是 XYZ 以外的任何东西”。如果不能保证,那就不要对它做出假设。 (即使您更有经验,最好避免这些假设)。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 2011-04-16
  • 2013-03-29
  • 2020-10-14
  • 2011-02-05
相关资源
最近更新 更多