迭代器在转换为字符串时抛出错误*

问题描述

考虑以下代码,其中: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::iterator' {aka 'std::_List_iteratorstd::__cxx11::basic_string'} 到 'std::__cxx11::string*' {aka 'std::__cxx11::basic_string*'} 在 初始化在 C:/Users/.. 中包含的文件中。

我的教授说迭代器粗略地说是一个指针,所以我希望这样使用它。为什么我会收到此错误,我该如何解决

解决方法

迭代器就像一个指针,但它不是一个指针。它指的是一个值,但它本身并不是一个指针。不过,您可以获得一个指针:

string* pelement = &*it;

请注意,虽然 &* 是对常规指针的逆运算,但它们通常并非如此,并且许多类型(特别是迭代器)覆盖 * 以表现不同,因此两者不抵消。也可以覆盖 &,尽管我能想到的合理用例较少。

根据评论,我认为您已经了解这一点,但您需要参考。原始指针在现代 C++ 中通常是不受欢迎的,并且引用清楚地传达了您的意图:“我暂时借用一下,我可能会修改它,但我不负责删除它”。出于教育目的将其指向一个指针很好,但参考方法是正确的 C++ 方法来完成您正在做的事情。