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的话就没问题了,为什么呀,求大佬解释一下

it -> empty(); //换个方式写一下就是(*it).empty() ,*it是个int,是个内置基本类型 , 是没有empty方法的
而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++) //去掉

参考技术A

首先感谢下庄政警的回复, 答的非常好!报错原因就是这个;

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++中迭代器的问题为啥这样会报错?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 共享指针的行为不像迭代器的标准指针?

为啥迭代器指向的数据在从列表中删除后保留

c++中列表迭代器的无效使用

发布模式下迭代器的边界检查(c++)

C++ 标准库值操作迭代器的常见函数

c++ 迭代器库