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

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


...全文
221 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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循环有可能无法结束。
  • 打赏
  • 举报
回复
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2017-11-07 02:34
社区公告
暂无公告