利用vector实现约瑟夫环的打印
2010-08-20 20:05
363 查看
最近在看《C++ Primer》一书,在容器一章,对容器有了初步的了解,结合到前段时间面试中提及约瑟夫环的老问题,常见的思路是用循环链表或数组来完成。
这里练练手,决定用vector顺序容器来实现:
期间过程中,由于对迭代器不是很了解,遇到一个问题:
“vector iterators incompatible”
在网络上查找原因,总结如下:
vector可以用任意方法实现erase,不保证在erase一个元素后,后续的元素一定被移动到这个iterator所引用的位置(地址)。当然,这在几乎所有STL的实现中,都是对的,这也就是以前用VC6编译后运行没有问题的原因。但如果这里用的不是vector,而是list或是map,运行到这里,程序会毫不犹豫的崩溃。
正确的做法是这样的:
STL里所有的容器类的erase实现都会返回一个iterator,这个iterator指向了“当前删除元素的后继元素,或是end()”
因此,在遍历容器的所有元素过程中通过erase删除一个元素后,将erase的返回值赋给迭代变量。
希望各位高手给于指点……
这里练练手,决定用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的返回值赋给迭代变量。
希望各位高手给于指点……
相关文章推荐
- VC利用EXCEL模板实现报表打印
- 利用css和js实现firefox和IE都支持的页面局部打印
- 续:利用XML实现通用WEB报表打印(实现篇)
- log4j利用自我构造Properties对象实现初始化打印到控制台
- 续:利用XML实现通用WEB报表打印(实现篇)
- 利用webBrowser实现万能打印
- 利用WebBrowser实现Web打印的分析
- 利用水晶报表实现Web打印(转)
- vector实现约瑟夫环
- ASP利用WebBrowser实现Web打印的分析
- 利用XML实现通用WEB报表打印
- 续:利用XML实现通用WEB报表打印(实现篇) 卢彦
- 利用XML实现通用WEB报表打印(1) 卢彦
- java利用IE浏览器实现web打印
- 利用Css实现WEB打印分页设置
- 利用webBrowser实现万能打印
- 利用富文本编辑器实现打印模板设置功能
- 利用vbs脚本实现设置IE的打印页眉页脚信息
- 自己实现集合框架(五):利用单链表解决约瑟夫环问题
- 利用XML实现通用WEB报表打印