【问题标题】:Iterator throwing an error when converting to string*迭代器在转换为字符串时抛出错误*
【发布时间】:2021-06-03 15:02:33
【问题描述】:

考虑以下代码,其中: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&amp; pelement = it;,您说您希望将迭代器视为指针?那里没有指针。您的意思是改用string* pelement = it; 吗?
  • @cigien 是的,抱歉打错了。我修好了
  • 大多数“C++ 教授”几乎不知道他们在说什么,所以一定要对他们所说的一切持保留态度。举个例子:在 C++ 中,目标是尽可能避免使用指针。老实说,任何教导相反的人都是在提供糟糕的建议。
  • 很大一部分 C++ 教授是 Java 教授,他们被勒索教授 C++,因此对指针以及何时合适存在许多误解(事实上,指针使用 new,用于Java 中的一切 都无济于事)。
  • 您使用的什么格式并不重要,重要的是它的可读性。这是一个方便的工具,您可以使用format.krzaq.cc 只需将您的代码粘贴到那里,然后单击“格式”即可查看差异。

标签: c++ string iterator


【解决方案1】:

迭代器的作用类似于指针,但它不是指针。它指的是一个值,但它本身并不是一个指针。不过你可以得到一个指针:

string* pelement = &*it;

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

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

【讨论】:

  • 我认为不能保证转换为指针对所有迭代器类型都有效。
  • @cigien。我使用的是什么类型的迭代器?我在cplusplus.com/reference/iterator看到,分类是按照功能来做的,不就是一个描述吗?您的声明暗示他们有不同的行为/实现
  • 我的意思是不保证迭代器与指针相同,具体取决于所使用的特定容器的迭代器。例如这不适用于std::vector&lt;bool&gt;::iterator
  • "也可以覆盖&amp;,尽管我能想到的合理用例较少" - 通常只有智能指针才能做到这一点.但是如果你需要考虑覆盖&amp;的类型,你可以使用std::addressof(),例如:type* pelement = std::addressof(*it);
  • @RemyLebeau & 和 addressof 有什么区别?
猜你喜欢
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
相关资源
最近更新 更多