C++ vector 容器利用类似于数组的连续内存空间来存储其元素,当利用其 e r a s e erase erase函数删除相应的元素之后,该容器会重新分配所有剩下的元素,同时 e r a s e erase erase函数会返回指向已经删除的那些元素的下一个元素的迭代器,以前所有指向被删除元素以后的元素的迭代器会失效。如图1所示。

 
图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所示。

 
图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所示。

 
图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++;
		}
	}
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐