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

时间:2015-06-22 21:32:40

标签: c++ pointers stl iterator

我正在尝试使用C ++解决Project Euler的问题#3,以了解如何使用C ++迭代器。根据我在网上看到的例子,我可以使用dereferened迭代器作为cout的参数,它将成功打印元素。通过相同的逻辑,我应该能够将迭代器作为指针传递,因为它指向我想要的元素,但是这不起作用,因为我认为它会:

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

在上面的链接(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;     

我收到指针转换错误:

错误:无法转换'std :: reverse_iterator&lt; __ gnu_cxx :: __ normal_iterator&gt; &GT; &gt;'to'long int *'用于参数'1'到'bool isPrime(long int *)'

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

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

2 个答案:

答案 0 :(得分:3)

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

辅助选项:传递&*it而不是it

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

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

答案 1 :(得分:0)

没有从stderr=subprocess.STDOUT类型到类型std::vector<T>::recerse_iterator的隐式转换。

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

T *

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

if ( isPrime( &*it ) )