【问题标题】:why can not p = itv?(vector problem from c++)为什么不能 p = itv?(来自 C++ 的向量问题)
【发布时间】:2021-04-10 09:02:27
【问题描述】:

这是我的代码:

vector<int>::iterator itv = vec.begin();
int *p;
p = itv; // ERROR!

我有一个简单的问题: 为什么p不能得到itv的值,因为p是地址,itv也是地址。

谢谢。 :D

【问题讨论】:

  • 不管怎样,只要itv指向一个有效的元素,你就可以使用&amp;*itv获取被引用元素的地址
  • 嗯,迭代器不是指针,所以它们是不兼容的。

标签: c++ pointers vector iterator


【解决方案1】:

一般来说,迭代器不定义为原始指针。

在某些编译器的旧版本中,类模板std::vector 的迭代器确实被定义为一个指针。

但在现代编译器中,标准容器的迭代器通常被定义为某些类的对象。

你可以用以下方式重写你的代码sn-p

vector<int>::iterator itv = vec.begin();
int *p;
p = &( *itv );

但更简单更安全的方法是写

int *p = vec.data();

这是一个演示程序。

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> vec = { 1, 2, 3, 4, 5 };
    
    for ( int *p = vec.data(); p != vec.data() + vec.size(); ++p )
    {
        std::cout << *p << ' ';
    }
    std::cout << '\n';
    
    return 0;
}

程序输出是

1 2 3 4 5

【讨论】:

    【解决方案2】:

    因为vector&lt;int&gt;::iteratorint* 是不同的类型,C++ 编译器不知道如何将它们转换为另一种,即使它们在语义上相似。此外,Iterator 不一定是内存中的地址(尽管可以这样实现)。

    无论如何,这是非常理想的行为。想象一下类似的情况

    std::list<int>::iterator itv;
    

    在这种情况下,如果您执行 cmets &amp;*itv 中建议的技巧,则访问 p++ 下的值将具有未定义的行为。

    【讨论】:

      【解决方案3】:

      我想在之前的所有答案中补充一点,尽管原始指针不是按类型划分的迭代器,但它们满足所有随机访问迭代器要求并且可以在 STL 算法中使用。

      例如:

      int arr[N];
      int *begin = arr;
      int *end = begin + N;
      
      // find
      int *result = std::find(begin, end, value);
      if (result != end) {
        // process found
      }
      
      // or sort
      std::sort(begin, end);
      

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 2018-11-01
        • 1970-01-01
        • 2016-11-09
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        相关资源
        最近更新 更多