簡體   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