【问题标题】:C++ STL: list with Pointers - Iterator cannot access?C++ STL:带有指针的列表 - 迭代器无法访问?
【发布时间】:2011-09-21 05:00:41
【问题描述】:

我正在为一个包含我的“对象”对象指针的 STL 列表而苦苦挣扎。

我声明:

list<Object*> objectlist;

并通过以下方式插入:

this->objectlist.push_back(new Object(address,value,profit));

并尝试像在地图和其他中一样进行迭代:

list<Object*>::iterator iter;

iter = this->objectlist.begin();

while(iter != this->objectlist.end())
{
    iter->print();
}

其中 print() 是类 Object 的公共方法;

这里有什么问题?

我无法通过迭代器访问列表中的对象?

【问题讨论】:

    标签: c++ list stl


    【解决方案1】:

    你需要(*iter)-&gt;print();

    由于您有一个指向指针的迭代器,因此您必须首先取消引用迭代器(这会为您提供Object*),然后箭头取消引用Object * 并允许调用打印。

    【讨论】:

    • 是的,您的迭代器不是指向您的对象类型的指针,而是一个迭代器。另外不要忘记你的增量,否则你将陷入无限循环。
    【解决方案2】:

    你没有增加你的迭代器!将您的 while 循环更改为 for 循环,如下所示:

    for (list<Object*>::const_iterator iter = this->objectlist.begin(),
         end = this->objectlist.end();
         iter != end;
         ++iter)
    {
        (*iter)->print();
    }
    

    (也 iter dereferences 指向一个指针,就像其他答案指出的那样。)

    【讨论】:

      【解决方案3】:

      您可以使用 *iter 访问迭代器所指向的值

      另外,请记住在每次迭代中递增迭代器。否则你会陷入死循环。

      像这样:

      iter = this->objectlist.begin();
      
      while(iter != this->objectlist.end())
      {
          (*iter)->print();
          iter++;
      }
      

      【讨论】:

        【解决方案4】:

        您可以尝试 C++11 方式(如果可能)。迭代器的解引用是免费的:)

        for (auto& iter: this->objectlist)
        {
             iter->print();
        }
        

        如果 print() 是一个常量函数,你应该使用

        for (const auto& iter: this->objectlist)
        

        【讨论】:

        • 2 个问题:-“i”应该是“iter”,对吧? - 是否需要“&”?没有它似乎也能正常工作
        【解决方案5】:

        您应该使用 STL 的 for_each() 而不是 for-loop - 请参阅 advantages of for_each 而不是简单的 for-loop。

        语法

        #include <algorithm> // 'for_each()' is in there
        
        std::for_each(InputIterator first, // Iterator start position
                      InputIterator last,  // Iterator end position
                      Function fn);        // Unary function - executed on all elements in range
        

        for_each 例子

        这是您的示例的外观 std::for_each() 而不是 for( ... )

        list<Object*> objectlist;
        
        // insert some elements …
        
        // Deletes all elements of 'objectlist'
        std::for_each(objectlist.begin(), objectlist.end(), DeleteObj<Object*>());
        

        一元函数

        一元函数是使用模板实现的,因此您可以将其与 any 类型一起使用。只需确保 T 是指针类型

        template<class T> class DeleteObj
        {
        public:
            bool operator()(T obj) const
            {
                delete obj;
                return true;
            }
        };
        

        顺便说一句。你没有把它作为模板来实现。并且:您也可以绑定一个成员函数而不是这样的实现!

        文档

        【讨论】:

          【解决方案6】:

          你应该使用以下方式:

          (*iter)->print()
          

          【讨论】:

          • 多说一句:*iter表示元素,所以你应该先获取元素,然后使用它。
          【解决方案7】:

          迭代器引用列表中的元素,因此对于T 类型的列表,取消引用迭代器会产生T 类型的值。

          在您的情况下,T 实际上是一个指针 - Object*。因此,iter-&gt; 调用(取消对迭代器的引用)会产生一个指针。您必须取消引用该指针才能访问实际对象。

          尝试使用

          (*iter)->print()
          

          改为。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-28
            • 2014-12-05
            • 1970-01-01
            • 2014-04-29
            • 2020-11-19
            • 1970-01-01
            • 1970-01-01
            • 2012-11-05
            相关资源
            最近更新 更多