【问题标题】:How to make a pointer iterator?如何制作指针迭代器?
【发布时间】:2016-04-28 02:00:51
【问题描述】:

由于某种原因,我无法创建指针迭代器。它被禁用了吗?我试过了,但是没用……

#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>')|

【问题讨论】:

  • 您是否有任何理由将listItem 作为指针而不是引用传递?
  • 因为我喜欢指针@tadman。 (奇怪的字符..)
  • 你喜欢什么,什么是好主意,在这里很明显是odds。从性能和代码正确性的角度来看,指针有许多缺点。使用最好的工具来完成这项工作,而不是你最习惯的工具。您只是假设listItem 是一个有效指针,而不是NULL,这可能是一个大错误。引用通常总是有效的,所以这个测试由编译器完成,不需要代码。
  • 另外,列表容器已经有了指针,所以指针内的指针指向指针??? xD
  • *listItem-&gt;begin() 应该是 listItem-&gt;begin()(*listItem).begin()end 也一样。

标签: c++ pointers listiterator


【解决方案1】:

您根本不需要使用operator*listItem-&gt;begin() 将返回迭代器。

for (it = listItem->begin(); it != listItem->end(); it++)
        std::cout << *it <<std::endl;
}

我正试图直接回答你的问题,正如其他回答者所说,你不需要在这里通过指针传递listItem,通过引用传递就足够了。

【讨论】:

    【解决方案2】:

    您可以将它们用作参考,让您自己轻松...

    #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;
    }
    

    经验法则

    始终使用引用。仅当您必须时提供指针。你可能会问为什么?

    1. 指针往往会使程序员感到困惑。即使是经验丰富的人。
    2. 指针可以改变它们“指向”的对象。这可能是可怕的 在某些情况下。
    3. 指针可以为空。例如:

    C++11中:

       int *p1 = nullptr;
    

    其他 C++:

       int *p1 = NULL;
       int *p2 = 0;
    
    1. 引用必须引用一个对象。这意味着你不能只输入一个数字 在 int 的“参考”上

    最佳实践

    1:请注意,您无法更改引用的引用,因此只需在引用之前添加关键字const,这样它们就不会更改它们所指向的内容。这是最佳做法,也可以确保您不会在更改引用所引用的内容时犯下愚蠢的错误。

      const int x = 0;
      const int &ref = x 
    

    【讨论】:

    • 这是教科书的例子,没什么花哨的,这确实是这样做的。
    • @Joel xD 。 tadman,是的,这是正常的做法!我要添加一些东西!
    • @Dsafds 要真正符合此处的 C++ 最佳实践,可以将const 添加到参考中,以确保有人不会得到关于更改数据的想法,以及提示编译器可以进行相应的优化。
    • 哇@tadman 我自己都不知道!这是一个非常好的想法/做法!添加到anwser中,谢谢建议!
    猜你喜欢
    • 2015-11-10
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多