问题描述
考虑以下代码,其中:list<string> elements
bool SearchElement(const string& product) {
for (list<string>::iterator it = elements.begin(); it != elements.end();i++) {
string& element = *it;
if ( element == product) {
return true;
}
}
return false;
}
我想用指针重写它:
bool SearchElement(const string& product) {
for (list<string>::iterator it = elements.begin(); it != elements.end();i++) {
string* pelement = it;
if ( *pelement == product) {
return true;
}
}
return false;
}
C:\Users...\C++\IShoppingApp.h:141:错误:无法转换
'std::__cxx11::liststd::__cxx11::basic_string
我的教授说迭代器粗略地说是一个指针,所以我希望这样使用它。为什么我会收到此错误,我该如何解决?
解决方法
迭代器就像一个指针,但它不是一个指针。它指的是一个值,但它本身并不是一个指针。不过,您可以获得一个指针:
string* pelement = &*it;
请注意,虽然 &
和 *
是对常规指针的逆运算,但它们通常并非如此,并且许多类型(特别是迭代器)覆盖 *
以表现不同,因此两者不抵消。也可以覆盖 &
,尽管我能想到的合理用例较少。
根据评论,我认为您已经了解这一点,但您需要参考。原始指针在现代 C++ 中通常是不受欢迎的,并且引用清楚地传达了您的意图:“我暂时借用一下,我可能会修改它,但我不负责删除它”。出于教育目的将其指向一个指针很好,但参考方法是正确的 C++ 方法来完成您正在做的事情。