您的位置:首页 > 其它

利用vector实现约瑟夫环的打印

2010-08-20 20:05 363 查看
最近在看《C++ Primer》一书,在容器一章,对容器有了初步的了解,结合到前段时间面试中提及约瑟夫环的老问题,常见的思路是用循环链表或数组来完成。

这里练练手,决定用vector顺序容器来实现:

]#include<vector>
#include<iostream>
using namespace std;

const int N = 1;
const int M = 1;
int main(int argc, char* argv[])
{
	vector<int> ring;
	// initialize
	for(int i=0; i<N;i++)
		ring.push_back(i+1);

	vector<int>::iterator iBegin = ring.begin();
	vector<int>::iterator iEnd;
	while ( !ring.empty() )
	{
		iEnd = ring.end();
		if(iBegin == iEnd )
			iBegin = ring.begin();
		
		for(int i=1;i<M;i++)
		{		
			iBegin++;
			if(iBegin >= iEnd)
				iBegin = ring.begin();
		}
		cout<<*iBegin<<endl;
		iBegin = ring.erase(iBegin);
	}
}


期间过程中,由于对迭代器不是很了解,遇到一个问题:

“vector iterators incompatible”

在网络上查找原因,总结如下:



vector可以用任意方法实现erase,不保证在erase一个元素后,后续的元素一定被移动到这个iterator所引用的位置(地址)。当然,这在几乎所有STL的实现中,都是对的,这也就是以前用VC6编译后运行没有问题的原因。但如果这里用的不是vector,而是list或是map,运行到这里,程序会毫不犹豫的崩溃。

正确的做法是这样的:

STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”

因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量。





希望各位高手给于指点……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: