【问题标题】:assign address to a iterator [closed]为迭代器分配地址[关闭]
【发布时间】:2019-01-05 10:18:05
【问题描述】:

我们知道 cpp 中的迭代器指向容器的某个元素,就像我们谈论向量一样

vector <int> v = {1,2,3,4,5}

vector<int>::iterator ptr;
ptr=v.begin();

ptr 将指向第一个内存块,例如 200 让我们声明另一个迭代器

vector<int>::iterator ptrend;
ptrend=v.end() 

which point to just next follow of last element say will 
be equal to 220

我的疑惑

1) 我们知道v.end()-v.begin() = v.size() 但在我们的案例中并非如此220 -200 =20 != size

2) 比如说vector&lt;int&gt;::iterator ptr=v.begin(); 在这里我们可以分配这样的东西ptr = &amp;a[3]

【问题讨论】:

  • 欢迎来到 Stack Overflow!请使用tour 并阅读How to Ask。关于你的问题,有一个特别的错误:你问了两个问题,这通常是不好的。
  • 但你还是回复了 :p 但我同意你的回答 ;)
  • 这似乎很方便,因为这两个问题或多或少都基于相同的有缺陷的假设。

标签: c++ iterator


【解决方案1】:

首先,查看 C++ 中“指针算法”的定义,它适用于元素,而不是字节。那么,仅仅因为一个迭代器引用了某个地址的对象,并不意味着两个迭代器之间的差异与它们引用的两个地址之间的差异是相同的数值。

其次,就像上面一样,仅仅因为迭代器引用某个地址并不意味着您可以为该迭代器分配一个地址。想一想迭代器与指针的不同之处,并将其与您对封装的了解结合起来。

【讨论】:

    【解决方案2】:

    1) 20 字节,是的,考虑到每个元素 4 字节,这是正确的。但是计算 v.end()-v.begin() 会为您提供向量的大小(更一般地,对于随机访问迭代器仅),而不是它们的地址差异。这不是 char* 的指针运算,它是迭代器上的 operator-,实现方式不同。

    2) 迭代器一般不能由指针创建。但是您可以使用std::advance(std::begin(a), 3),它可以逐一递增或直接使用+3,具体取决于迭代器类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      相关资源
      最近更新 更多