将迭代器的元素传递给函数:指针类型错误

Passing iterator's element to a function: wrong type of pointer

我正在尝试使用 C++ 解决 Project Euler 的问题 #3,以了解如何使用 C++ 迭代器。根据我在网上看到的例子,我可以使用取消引用的迭代器作为 cout 的参数,它会成功打印元素。按照同样的逻辑,我应该能够将迭代器作为指针传递,因为它指向我想要的元素,但是这并没有像我相信的那样工作:

参考:http://www.cprogramming.com/tutorial/stl/iterators.html

在上面的 link(The STL approach (use this) 段)中,作者使用

打印出他的矢量元素

cout<<*myIntVectorIterator<<" ";

在我的代码中,我尝试将迭代器作为元素传递,但是它遇到了指针转换的问题:

 std::vector<long>::reverse_iterator it = factors.rbegin();                                                         
 for (; it != factors.rend(); ++it) {                                                                                                                  
    if(isPrime(it))                                                                                                  
    {                                                             
         std::cout << *it << std::endl;                           
         break;           
    }                                                                                                   
 return 0;     

我收到指针转换错误:

错误:无法将参数“1”的“std::reverse_iterator<__gnu_cxx::__normal_iterator>>>”转换为“long int*”到“bool isPrime” (long int*)'

将此指针显式转换为 long* if(isPrime((long *)*it)) 会导致分段错误。

我能解释一下这里发生了什么吗?提前致谢。

首选选项:更改 isPrime 以获取 long(并将 *it 传递给它)。

第二个选项:传递 &*it 而不是 it

您的原始代码不起作用,因为 it 是一个迭代器(它是一个 class),而函数需要 long int * 并且没有从迭代器到指针的隐式转换.

*it 在迭代器对象上调用重载的 operator* 并给出存储 long 的内存位置的指示符;所以你可以获取它的地址以获得指向该位置的指针。

没有从类型 std::vector<T>::recerse_iterator 到类型 T * 的隐式转换。

所以你已经明确地传递了一个指向函数的指针

if ( isPrime( &*it ) )   

你也确实可以使用指针而不是迭代器。例如

for ( long *p = factors.data() + factors.size(); p != factors.data();  )   
{
    if ( isPrime( --p ) )
    {                                                             
         std::cout << *p << std::endl;                           
         break;           
    }
}