[英]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.