提问者:小点点

为什么不能p=itv?(来自C++的向量问题)


这是我的代码:

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

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

谢了。d


共2个答案

匿名用户

通常,迭代器不被定义为原始指针。

在一些编译器的旧版本中,类模板的迭代器实际上被定义为只是一个指针。

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

您可以按以下方式重写代码片段

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

匿名用户

因为是不同的类型,而且C++编译器不知道如何将它们转换为另一个,即使它们在语义上相似。而且,迭代器不一定是内存中的地址(尽管它可以这样实现)。

不管怎么说,这是一种令人向往的行为。想象一下类似的情况

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

在这种情况下,如果执行注释中建议的技巧,访问下的值将具有未定义的行为。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(p|itv|c++|向量)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?