[英]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中一個長期存在的設計“問題”。 迭代器不允許修改它們迭代的基礎序列的結構:即,您可以修改(有時)元素本身,但不能添加/刪除元素。 雖然InputIterator
和OutputIterator
在這方面有點特別......哼......
這實際上是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.