我正在尝试使用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))
会导致分段错误。
我能解释一下这里发生了什么吗?提前谢谢。
答案 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 ) )