繁体   English   中英

STL向量,迭代器和插入(C ++)

[英]STL Vector, Iterator and Insert (C++)

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

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

谢谢马库斯

在您显示的代码中,这是不可能的。 特别是因为在迭代过程中不应向/向量添加/删除元素。

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

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

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

所以,不,对不起,没有办法真正修改矢量。

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

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

首先,您必须更改界面。 给定两个迭代器,没有办法回到它们引用的容器; 所以如果你想修改容器,你必须传递一个引用,即:

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

完成后:插入可以使迭代器无效。 所以这取决于你想要插入的位置。 如果要插入当前位置: std::vector<>::insert of single element返回一个迭代器,该元素插入到元素之前,因此可以将它分配给迭代器,调整(如果需要的话) ),并继续:

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[]而不是迭代器进行迭代可能更简单。

在迭代它时,不可能将元素添加到向量中。 另外,你肯定不能只用一对迭代器向一个向量添加一个 - 你需要一个指向整个向量对象的指针/引用。

您可以做的最好的事情是返回一个由调用函数添加的新组件的向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM