如何制作指针迭代器?
How to make a pointer iterator?
出于某种原因,我无法制作指针迭代器。它被禁用了吗?我试过了但是没用...
#include <iostream>
#include <list>
#include <vector>
#include <string>
template<class T>
void convertListToVector(std::list<T> *listItem) {
typename std::list<T>::iterator it;
for (it = *listItem->begin(); it != *listItem->end(); it++)
std::cout << *it <<std::endl;
}
int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(&listExample);
return 0;
}
错误:
error: no match for 'operator=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|
error: no match for 'operator!=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|
您可以将它们作为参考,让您自己轻松...
#include <iostream>
#include <list>
#include <vector>
#include <string>
template<class T>
void convertListToVector(std::list<T> &listItem) {
typename std::list<T>::iterator it;
for (it = listItem.begin(); it != listItem.end(); it++)
std::cout << *it <<std::endl;
}
int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(listExample);
return 0;
}
经验法则
全程使用参考资料。仅在您 有 时提供指示。你可能会问为什么?
- 指针往往会使程序员感到困惑。即使是有经验的。
- 指针可以改变它们 'pointing' 的含义。这可能很糟糕
在某些场合。
- 指针可以为空。例如:
在C++11中:
int *p1 = nullptr;
其他 C++:
int *p1 = NULL;
int *p2 = 0;
- 引用必须引用一个对象。这意味着你不能只输入一个数字
在 int
的 'reference' 上
最佳实践
1:请注意,您无法更改引用的内容,因此只需在引用前添加关键字 const
,这样它们就不会更改所指向的内容。这是最佳实践,也确保您不会犯下更改引用所引用内容的愚蠢错误。
const int x = 0;
const int &ref = x
您根本不需要使用 operator*
,listItem->begin()
将 return 迭代器。
for (it = listItem->begin(); it != listItem->end(); it++)
std::cout << *it <<std::endl;
}
我想直接回答你的问题,正如其他回答者所说,你不需要在这里通过指针传递listItem
,通过引用传递就足够了。
出于某种原因,我无法制作指针迭代器。它被禁用了吗?我试过了但是没用...
#include <iostream>
#include <list>
#include <vector>
#include <string>
template<class T>
void convertListToVector(std::list<T> *listItem) {
typename std::list<T>::iterator it;
for (it = *listItem->begin(); it != *listItem->end(); it++)
std::cout << *it <<std::endl;
}
int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(&listExample);
return 0;
}
错误:
error: no match for 'operator=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|
error: no match for 'operator!=' (operand types are 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' and 'std::basic_string<char>')|
您可以将它们作为参考,让您自己轻松...
#include <iostream>
#include <list>
#include <vector>
#include <string>
template<class T>
void convertListToVector(std::list<T> &listItem) {
typename std::list<T>::iterator it;
for (it = listItem.begin(); it != listItem.end(); it++)
std::cout << *it <<std::endl;
}
int main()
{
std::list<std::string> listExample;
listExample.push_back("2");
listExample.push_back("3");
listExample.push_back("5");
convertListToVector(listExample);
return 0;
}
经验法则
全程使用参考资料。仅在您 有 时提供指示。你可能会问为什么?
- 指针往往会使程序员感到困惑。即使是有经验的。
- 指针可以改变它们 'pointing' 的含义。这可能很糟糕 在某些场合。
- 指针可以为空。例如:
在C++11中:
int *p1 = nullptr;
其他 C++:
int *p1 = NULL;
int *p2 = 0;
- 引用必须引用一个对象。这意味着你不能只输入一个数字 在 int 的 'reference' 上
最佳实践
1:请注意,您无法更改引用的内容,因此只需在引用前添加关键字 const
,这样它们就不会更改所指向的内容。这是最佳实践,也确保您不会犯下更改引用所引用内容的愚蠢错误。
const int x = 0;
const int &ref = x
您根本不需要使用 operator*
,listItem->begin()
将 return 迭代器。
for (it = listItem->begin(); it != listItem->end(); it++)
std::cout << *it <<std::endl;
}
我想直接回答你的问题,正如其他回答者所说,你不需要在这里通过指针传递listItem
,通过引用传递就足够了。