stl实现插入排序的有关问题
stl实现插入排序的问题
很简单的插入排序 但是找了好久都没找到 请各位看看
------解决方案--------------------
for (VI j = temp.end()-1;j>=temp.begin();--j)
//这一句,迭代器失效在插入之后
------解决方案--------------------
temp.insert(temp.begin(),(*i));//问题应该在这里 但是不知道啥问题
一句后面break好像可以。。。
------解决方案--------------------
for (VI j = temp.end()-1;j>=temp.begin();--j)
跳出这个循环的条件是 j<temp.begin()而不是j等于temp.begin(),也就是说j指向了temp.begin()的前一个位置才跳出循环
if (j==temp.begin()&&(*i)<(*j))
这一句有问题,j有可能不等于temp.begin()而是指向了temp.begin()的前一个位置
将这一句更改为:if (j==temp.begin()-1&&(*i)<(*(j-1)))
------解决方案--------------------
不要在stl不熟练的情况下,复用vector。加一个vector的临时变量来存储中间过程。
------解决方案--------------------
------解决方案--------------------
j指向begin的前一个位置的时候不就退出循环了吗? 所以我觉得这里指不到啊 !而且在if (j==temp.begin()&&(*i)<(*j)) 这句话后面加一个break就可以了,我觉得是不是如果不加break 就会使j=begin()-1 从而产生非法指针?
j =begin() - 1;不会产生非法指针的,况且j根本就不是指针是一个迭代器,迭代器和指针是不一样的,唉,楼主你要多看看书啊,因为vector容器允许它的迭代器进行算术运算,也允许迭代器指向第一个元素的前一个位置
------解决方案--------------------
- C/C++ code
template <class T> void InsertSort(vector<T>& v) //插入排序 { vector<T> temp; typedef vector<T>::iterator VI; temp.push_back(v[0]); for (VI i = v.begin()+1;i<v.end();++i) { for (VI j = temp.end()-1;j>=temp.begin();--j) { if ((*i)>=(*j)) { temp.insert(j+1,(*i)); break; } if (j==temp.begin()&&(*i)<(*j)) { temp.insert(temp.begin(),(*i));//[color=#800000]问题应该在这里 但是不知道啥问题[/color] } } } v=temp; }
很简单的插入排序 但是找了好久都没找到 请各位看看
------解决方案--------------------
for (VI j = temp.end()-1;j>=temp.begin();--j)
//这一句,迭代器失效在插入之后
------解决方案--------------------
temp.insert(temp.begin(),(*i));//问题应该在这里 但是不知道啥问题
一句后面break好像可以。。。
------解决方案--------------------
for (VI j = temp.end()-1;j>=temp.begin();--j)
跳出这个循环的条件是 j<temp.begin()而不是j等于temp.begin(),也就是说j指向了temp.begin()的前一个位置才跳出循环
if (j==temp.begin()&&(*i)<(*j))
这一句有问题,j有可能不等于temp.begin()而是指向了temp.begin()的前一个位置
将这一句更改为:if (j==temp.begin()-1&&(*i)<(*(j-1)))
------解决方案--------------------
不要在stl不熟练的情况下,复用vector。加一个vector的临时变量来存储中间过程。
------解决方案--------------------
------解决方案--------------------
j指向begin的前一个位置的时候不就退出循环了吗? 所以我觉得这里指不到啊 !而且在if (j==temp.begin()&&(*i)<(*j)) 这句话后面加一个break就可以了,我觉得是不是如果不加break 就会使j=begin()-1 从而产生非法指针?
j =begin() - 1;不会产生非法指针的,况且j根本就不是指针是一个迭代器,迭代器和指针是不一样的,唉,楼主你要多看看书啊,因为vector容器允许它的迭代器进行算术运算,也允许迭代器指向第一个元素的前一个位置
------解决方案--------------------
- C/C++ code
if (j==temp.begin()&&(*i)<(*j)) { temp.insert(temp.begin(),(*i));//[color=#800000]问题应该在这里 但是不知道啥问题[/color] break;//在这里加个break就可以了 }
------解决方案--------------------
如果你不在temp.insert(temp.begin(),(*i));这条语句后加break的话,执行完插入语句后,迭代器j就失效了,不再执向temp.begin()了,而程序会继续执行下一句,也就是下面这一句:
for (VI j = temp.end()-1;j>=temp.begin();--j);会继续对j进行--j;操作,然而当前迭代器j已经失效了,再对j进行前自减操作是非法的,会发生运行时错误,程序崩溃