c++中迭代器的问题为啥这样会报错?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中迭代器的问题为啥这样会报错?相关的知识,希望对你有一定的参考价值。
vector<int> s(10);
for(auto it = s.begin() ; it != s.end() && !it -> empty(); it++ )
cout << *it<<endl;
这里&&后面的it报错表达式必须包含指向类的指针类型
但是把这里int 换成string的话就没问题了,为什么呀,求大佬解释一下
而string就不一样了 ,string是个类,它有empty方法
是你的代码逻辑不对,&&后面不应该是!it -> empty(),而应该是!s.empty()
for (auto it = s.begin(); it != s.end() && !s.empty(); it++) //!s.empty()
cout << *it << endl;追问
能问一下,那如果是int的话,那个it代表的是什么,我说的是不加*的it,我一直以为他是个数字,但是也没办法对它进行输出,而且用它与别的数进行判断大小也不行,所以很疑惑这个it代表的什么概念
追答it的类型是 vector《int》::iterator : 由int组成的vector的迭代器,每一种容器都有它自己类型的迭代器,这些迭代器有相同的语法,因为它们是由模板生成的,这是c++泛型算法的基础。
在c++11以前,迭代器都是这样定义的: vector《int》::iterator it; c++11可以用auto了,让编译器识别
迭代器的底层实现大都是个指针, 但你不能以指针看待它。迭代器只能与同类型的迭代器比较
嗯嗯,大概明白了,但是我把it.empty()改成s.empty()就达不到我循环的条件了,也就是没办法让迭代器一直循环到它最后一个元素结束,这应该怎改呢
追答是!s.empty()注意前面的"!" ,
实际上!s.empty()是多余的,因为容器为空时begin()和end()是同一个位置,去掉empty:
for (auto it = s.begin(); it != s.end(); it++) //去掉
首先感谢下庄政警的回复, 答的非常好!报错原因就是这个;
lz想要解决的话,定义成vector<string> s;
就可以使用it != s.end() && !it -> empty()
为啥HttpContext.AcceptWebSocketRequest函数获取实例时会报错?
【中文标题】为啥HttpContext.AcceptWebSocketRequest函数获取实例时会报错?【英文标题】:Why does HttpContext.AcceptWebSocketRequest function make an error when it gets an instance?为什么HttpContext.AcceptWebSocketRequest函数获取实例时会报错? 【发布时间】:2015-06-19 06:20:35 【问题描述】:根据网上的一些示例和this guide我创建了一个webSocket的连接。
public class sockets: IHttpHandler
public bool IsReusable
get
throw new NotImplementedException();
public void ProcessRequest(HttpContext context)
if (context.IsWebSocketRequest)
context.AcceptWebSocketRequest(new socketHandler());
public class socketHandler: WebSocketHandler
public socketHandler(): base(null)
行中有错误-
context.AcceptWebSocketRequest(new socketHandler());
错误:
参数 1:无法从 'socketHandler' 转换为 'System.Func(System.Web.WebSockets.AspNetWebSocketContext,System.Threading.Tasks.Task)'
谁能帮帮我?
【问题讨论】:
【参考方案1】:AcceptWebSocketRequest
将方法作为参数,而不是类实例。您的代码应如下所示:
public void ProcessRequest(HttpContext context)
if (context.IsWebSocketRequest)
context.AcceptWebSocketRequest(HandleWebSocket);
private Task HandleWebSocket(WebSocketContext wsContext)
// Do something useful
【讨论】:
感谢您的帮助..那么我链接到的指南中的示例是错误的?但是,在 socketHandler 类中,我实现了 OnOpen、OnMessage 等函数……现在我不明白这些函数何时会发生?更重要的是,javascript中的onOpen函数什么时候发生? 您应该看看这个 SO question,其中一个答案可能适合您的需求。 ***.com/questions/25668398/…【参考方案2】:您在尝试使用 Microsoft.Web.WebSockets 中的函数时引用了 System.Web 中的函数。 添加适当的引用,它将起作用。
【讨论】:
感谢工作。该教程似乎没有代码下载。这确实帮助我解决了问题以上是关于c++中迭代器的问题为啥这样会报错?的主要内容,如果未能解决你的问题,请参考以下文章