C++ vector 容器的迭代删除操作
C++ vector 容器利用类似于数组的连续内存空间来存储其元素,当利用其eraseeraseerase函数删除相应的元素之后,该容器会重新分配所有剩下的元素,同时eraseeraseerase函数会返回指向已经删除的那些元素的下一个元素的迭代器,以前所有指向被删除元素以后的元素的迭代器会失效。如图1所示。 图1.int main(){
C++ vector 容器利用类似于数组的连续内存空间来存储其元素,当利用其 e r a s e erase erase函数删除相应的元素之后,该容器会重新分配所有剩下的元素,同时 e r a s e erase erase函数会返回指向已经删除的那些元素的下一个元素的迭代器,以前所有指向被删除元素以后的元素的迭代器会失效。如图1所示。
int main()
{
vector<int> myvector;
for (int i = 1; i <= 7; i++)
myvector.push_back(i);
auto iter3 = myvector.begin() + 3;
auto iter5 = myvector.begin()+5;
myvector.erase(iter3);
//迭代器iter5失效
myvector.erase(iter5);
}
以上代码运行出错如图2所示。
为了删除一个序列里面的所有元素,一般的模式如下,但是对于 v e c t o r vector vector容器来说似乎行不通。似乎是删除当前元素后指向被删除元素后面的 i t e r iter iter迭代器就失效了。
int main()
{
vector<int> myvector;
for (int i = 1; i <= 7; i++)
myvector.push_back(i);
for (auto iter = myvector.begin(); iter != myvector.end(); iter++)
{
if (*iter > 3)
{
cout << "num is " << *iter << endl;
myvector.erase(iter);
}
}
}
以上代码运行出错如图3所示。
为了使得删除一个元素后迭代器继续有效,我们必须通过 e r a s e erase erase函数的返回值来回去有效的迭代器。下面是测试代码,这次没有报错了。
int main()
{
vector<int> myvector;
for (int i = 1; i <= 7; i++)
myvector.push_back(i);
for (auto iter = myvector.begin(); iter != myvector.end(); )
{
if (*iter > 3)
{
cout << "num is " << *iter << endl;
iter=myvector.erase(iter);
}
else
{
iter++;
}
}
}
更多推荐
所有评论(0)