关于陈硕书籍《服务端编程》为什么要将++it向前挪动

dante502 2017-11-07 02:34:49
先贴代码,位置为第16页,小弟实在不理解为什么为什么特意去移动++it的位置。
如果有明白的朋友麻烦告诉一下这样做的理由。


...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoolCarpe 2017-11-07
  • 打赏
  • 举报
回复
引用 8 楼 sdghchj 的回复:
[quote=引用 4 楼 dante502 的回复:] [quote=引用 3 楼 sdghchj 的回复:] 循环都没搞懂就去看服务端编程,无语。 STL标准库迭带器。。。
我知道这是个迭代器啊,我也知道list是双向链表实现的,关键把++it往前挪动一行到底有什么意义啊。 是在迭代器失效前进行++操作吗?但已经换成了list,即使++在update函数后面也应该没有影响才对啊。[/quote] 这本书讲的东西也不是100%对的。 这里vector换list并没有解决本身问题,纯粹就是换了个容器,作者以为update函数里调用unregister对observers_进行了某个元素的erase或者修改会导致外部迭带器it的失效,所以在失效前赶紧先++it让它指向下一个元素,而其实现在vector的实现算法中删除和修改并不会导致已有迭带器的失效问题,因为vector内部数据是连续存储的堆内存,只有push_back增加元素时因已有堆内存不够需要重新申请才可能导致已有迭带器无效。除非update里对observers_进行了元素增加。 所以只有可能erase最后一个元素后再++it导致的越界问题,而这个问题,不是靠什么换成list以及++it提前一行所能解决的。 [/quote]
sdghchj 2017-11-07
  • 打赏
  • 举报
回复

//以下代码只会删除第一个2,第二个2被++it跳过删除。
    std::vector<int> v{1,2,2,3,4,5,6,7,8};
    auto it = v.begin();
    while(it != v.end()){
        if(*it == 2){
            v.erase(it);
        }
        ++ it;
    }

    for(auto it:v){
        std::cout<<it <<" ";    //结果 1 2 3 4 5 6 7 8
    }

    //删除8之后,it已经指向了v的end,再++it就越界了。
    std::vector<int> v{1,2,2,3,4,5,6,7,8};
    auto it = v.begin();
    while(it != v.end()){
        if(*it == 8){
            v.erase(it);
        }
        ++ it;
    }
sdghchj 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 dante502 的回复:
[quote=引用 3 楼 sdghchj 的回复:] 循环都没搞懂就去看服务端编程,无语。 STL标准库迭带器。。。
我知道这是个迭代器啊,我也知道list是双向链表实现的,关键把++it往前挪动一行到底有什么意义啊。 是在迭代器失效前进行++操作吗?但已经换成了list,即使++在update函数后面也应该没有影响才对啊。[/quote] 这本书讲的东西也不是100%对的。 这里vector换list并没有解决本身问题,纯粹就是换了个容器,作者以为update函数里调用unregister对observers_进行了某个元素的erase或者修改会导致外部迭带器it的失效,所以在失效前赶紧先++it让它指向下一个元素,而其实现在vector的实现算法中删除和修改并不会导致已有迭带器的失效问题,因为vector内部数据是连续存储的堆内存,只有push_back增加元素时因已有堆内存不够需要重新申请才可能导致已有迭带器无效。除非update里对observers_进行了元素增加。 所以只有可能erase最后一个元素后再++it导致的越界问题,而这个问题,不是靠什么换成list以及++it提前一行所能解决的。
jiht594 2017-11-07
  • 打赏
  • 举报
回复
sorry 没看明白问题

不懂帮顶
jiht594 2017-11-07
  • 打赏
  • 举报
回复
引用 1 楼 hefashion0190 的回复:
这不是个循环遍历吗? 如果无++, while循环有可能无法结束。


else中erase函数的返回值更新了it, 不需要在++
所以++it放在了if中

你是问这个吗?
jiht594 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 dante502 的回复:
[quote=引用 3 楼 sdghchj 的回复:]
循环都没搞懂就去看服务端编程,无语。
STL标准库迭带器。。。

我知道这是个迭代器啊,我也知道list是双向链表实现的,关键把++it往前挪动一行到底有什么意义啊。
是在迭代器失效前进行++操作吗?但已经换成了list,即使++在update函数后面也应该没有影响才对啊。[/quote]

说的很明白了, 不++的话, while是死循环 死循环 死循环
dante502 2017-11-07
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
循环都没搞懂就去看服务端编程,无语。 STL标准库迭带器。。。
我知道这是个迭代器啊,我也知道list是双向链表实现的,关键把++it往前挪动一行到底有什么意义啊。 是在迭代器失效前进行++操作吗?但已经换成了list,即使++在update函数后面也应该没有影响才对啊。
dante502 2017-11-07
  • 打赏
  • 举报
回复
引用 1 楼 hefashion0190 的回复:
这不是个循环遍历吗? 如果无++, while循环有可能无法结束。
不是没有++,而是++从后面挪动到了前面,我想知道这么做具体有什么意义。
sdghchj 2017-11-07
  • 打赏
  • 举报
回复
循环都没搞懂就去看服务端编程,无语。 STL标准库迭带器。。。
FoolCarpe 2017-11-07
  • 打赏
  • 举报
回复
这不是个循环遍历吗? 如果无++, while循环有可能无法结束。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧