将迭代器的元素传递给函数:指针类型错误
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;
}
}
我正在尝试使用 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;
}
}