求问:容器的end函数为什么返回的是最后一个值的下一个位置

C++语言 码拜 9年前 (2016-05-20) 1568次浏览
算法书上面看到了一道题,就是小猫钓鱼的游戏,出牌时,假如某人打出的牌与桌子上的某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依此放到本人手牌中的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(题外话,不是重点)
下面是本人的代码,中间用了一个end函数,调试中发现其返回的是最后一个值的下一个位置,而且该位置的值初始化为0了,这令本人很疑惑,麻烦各位高手帮本人看看究竟出了什么问题,代码如下:

//小猫钓鱼算法
#include<iostream>
#include<deque>
#include<vector>
using namespace std;
int main()
{
	deque<int> dui;
	deque<int> xiaohong,xiaoming;
	int card;
	cout<<"请输入小明的手牌:";
	while(cin>>card){
	  xiaoming.push_back(card);
	  if(cin.get()=="\n")
	     break;
	 }
	cout<<"请输入小红的手牌:";
	while(cin>>card){
	  xiaohong.push_back(card);
	  if(cin.get()=="\n")
	     break;
	 }
	while(xiaoming.size() != 0 && xiaohong.size() != 0)
	{
		deque<int>::iterator mt=xiaoming.begin(),ht=xiaohong.begin(),point;
		//小明出手。 
        int flag=0;
        //检查能否可以赢牌。 
		for(deque<int>::iterator beg=dui.begin(); beg!=dui.end(); ++beg){
			if(*beg==*mt){
				flag=1;
			}
		}
		//不赢牌的操作。 
		if(flag==0){
			dui.push_back(*mt);
			xiaoming.pop_front();
		}
		//赢牌的操作。 
		if(flag==1){
		   xiaoming.push_back(*mt);
		   xiaoming.pop_front();
		   point=dui.end()-1;  //要问的就是这里的end,返回的是下一个位置,原以为
                    //是未定义的,但调试发现该处值初始化为了0。手动减去1程序
                    //运算结果正确。
		   while(*point!=*mt){
		   	  xiaoming.push_back(*point);
		   	  dui.erase(point);
		   	  --point;
		   }
		   xiaoming.push_back(*point);
		   dui.erase(point);
		}
		//检查小明能否打完了。
		if(xiaoming.size()==0)
		  break; 
		//小红出手。 
        flag=0;
		for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
			if(*beg==*ht){
				flag=1;
			}
		}
		if(flag==0){
			dui.push_back(*ht);
			xiaohong.pop_front();
		}
		if(flag==1){
		   xiaohong.push_back(*ht);
		   xiaohong.pop_front();
		   point=dui.end()-1;
		   while(*point!=*ht){
		   	  xiaohong.push_back(*point);
		   	  dui.erase(point);
		   	  --point;
		   }
		   xiaohong.push_back(*point);
		   dui.erase(point);
		}
	}
    if(xiaohong.size()==0)
    {
    	cout<<"小明胜利!"<<endl;
		if(dui.size() != 0){
			cout<<"此时桌子上的牌有:";
		for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
			cout<<*beg<<" ";
		} 
		cout<<endl;
	   }
		else
		   cout<<"此时桌子上已经没有牌了!"<<endl;
		cout<<"此时小明的手牌有:";
	    for(deque<int>::iterator beg =xiaoming.begin();beg!=xiaoming.end();++beg){
			cout<<*beg<<" ";
		} 
		cout<<endl;
	} 
	if(xiaoming.size()==0){
    	cout<<"小红胜利!"<<endl;
		if(dui.size()!= 0){
			cout<<"此时桌子上的牌有:";
		for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
			cout<<*beg<<" ";
		} 
		cout<<endl;
	    }
		else
		   cout<<"此时桌子上已经没有牌了!"<<endl;
		cout<<"此时小红的手牌有:";
	    for(deque<int>::iterator beg =xiaohong.begin();beg!=xiaohong.end();++beg){
			cout<<*beg<<" ";
		} 
		cout<<endl;
	} 
	return 0;
}
解决方案

8

引用:

翻书复习的时候想起来end确实指向下一个位置,问题改为:为什么这个未定义的值会被初始化为0,还有deque容器中往后添加新元素能否会使迭代器失效?往前又怎么样呢?谢谢。

第一个问题:看下标准和具体的实现
第二个问题:本人验证一下,然后想想为什么;

7

就是返回最后一个元素的下一个,标准要求的。

5

end()指向最后一个元素之后,这是一种编程假定,迭代器都是左闭右开式的。deque在任何位置添加元素都会使iter失效,这是由deque内存形式决定的(分块链表形式)

10

5

[begin,end)
为了计算end-begin方便

5

这是一种‘哨兵’设计理念。end相当于一个‘哨兵’,当你在遍历‘队伍’到这个哨兵时说明已经结束了

5

容器为空的时候  end 该返回什么?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求问:容器的end函数为什么返回的是最后一个值的下一个位置
喜欢 (0)
[1034331897@qq.com]
分享 (0)