【问题标题】:STL Vector, Iterator and Insert (C++)STL 向量、迭代器和插入 (C++)
【发布时间】:2012-01-05 12:35:38
【问题描述】:

我有一个传递向量迭代器的方法。 在这种方法中,我想在向量中添加一些元素,但我不确定当只有迭代器时这是否可行

void GUIComponentText::AddAttributes(vector<GUIComponentAttribute*>::iterator begin, vector<GUIComponentAttribute*>::iterator end)
{
    for (vector<GUIComponentAttribute*>::iterator i = begin; i != end; ++i)
    {
        GUIComponentAttribute &attrib = *(*i);

        // Here are the GUIComponentAttribute objects analyzed - if an object of a 
        // special kind appears, I would like to add some elements to the vector
    }
}

谢谢 马库斯

【问题讨论】:

    标签: c++ vector iterator


    【解决方案1】:

    在您显示的代码中,这是不可能的。尤其是因为您不应该在迭代矢量时向矢量添加/删除元素。

    【讨论】:

    • 谢谢,我几乎猜到了。在这种情况下,目的是将组合属性拆分为它们的部分,以便能够保留算法的其余部分。所以我会尝试找到解决方法
    【解决方案2】:

    这是 STL 中长期存在的设计“问题”。迭代器不允许修改它们正在迭代的底层序列的结构:即您可以(有时)修改元素本身,但不能添加/删除元素。虽然InputIteratorOutputIterator在这方面有点特别……嗯……

    这实际上是erase/remove成语的原因:

    vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end());
    

    所以,不,抱歉,没有办法实际修改矢量。

    但是,如上所示,您可以完美地使用remove_if 算法并简单地返回有效范围的新端点...或者您可以要求以整个向量开头。

    正如 Björn 所指出的,在迭代序列结构时修改序列结构很容易出错。

    【讨论】:

      【解决方案3】:

      首先,您必须更改界面。给定两个迭代器, 无法返回它们所指的容器;因此,如果 你想修改容器,你必须传递一个对它的引用, 即:

      void GUIComponentText::AddAttributes(
              std::vector<GUIComponentAttribute*>& attributes )
      {
          for ( std::vector<GUIComponentAttribute*>::iter = attributes.begin();
                  iter != attributes.end();
                  ++ iter )
          {
              //  ...
          }
      }
      

      这样做:插入会使迭代器无效。所以这取决于 您要插入的位置。如果要在当前插入 position: std::vector&lt;&gt;::insert 的单个元素返回一个 该元素的迭代器,它被插入到你的元素之前,所以你 可以将其分配给您的迭代器,调整(如有必要),然后继续:

      iter = attributes.insert(iter, newAttribute);
      ++ iter;   //  Return to where we were...
      

      如果您要附加 (push_back),问题会更复杂一些; 您需要计算偏移量,然后重建迭代器:

      size_t offset = iter - attributes.begin();
      attributes.push_back( nweAttribute );
      iter = attributes.begin() + offset;
      

      在这种情况下,使用size_t[],而不是迭代器。

      【讨论】:

      • 感谢您的详细回答,绝对有帮助。 (不幸的是,在这种情况下,界面是不可更改的)
      【解决方案4】:

      在对向量进行迭代时,无法将元素添加到向量中。此外,你当然不能只用一对迭代器将一个添加到向量中——你需要一个指向整个向量对象的指针/引用。

      你能做的最好的就是返回一个新组件的向量,以便调用函数添加。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-21
        • 2020-11-06
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-11
        相关资源
        最近更新 更多