C++/BOOST filesystem fs::directory_iterator一个滑稽的错误

错误来源于,用

fs::directory_iterator iter(folderPath), end;

然后for循环

for (; iter != iter_end; ++iter) {}

最开始没问题,后来说加个进度条,统计一下所有文件数量,用了std::distance,

int totalFiles = std::distance(iter, iter_end);std::cout << " totalFiles is " << totalFiles << std::endl;

奇怪的事情发生了

明明统计得到几百个文件,可是for循环一次都不动。

写了个测试代码:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <boost/filesystem.hpp>namespace fs = boost::filesystem;
int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 创建迭代器auto beginIter = numbers.begin();auto endIter = numbers.end();// 计算距离std::cout <<"iter == iter_end? " << (beginIter == endIter) <<std::endl;std::ptrdiff_t dist = std::distance(beginIter, endIter);std::cout <<"iter == iter_end? " << (beginIter == endIter) <<std::endl;std::cout << "距离: " << dist << std::endl;std::cout << "*beginIter : " << *beginIter << std::endl;fs::directory_iterator iter("/home/hqw"), end;std::cout <<"iter == iter_end? " << (iter == end) <<std::endl;std::ptrdiff_t dist2 = std::distance(iter, end);std::cout <<"iter == iter_end? " << (iter == end) <<std::endl;std::cout << "距离: " << dist2 << std::endl;return 0;
}
iter == iter_end? 0
iter == iter_end? 0
距离: 5
*beginIter : 1
距离: 5
iter == iter_end? 0
iter == iter_end? 1
距离: 101

通过输出结果可知,默认情况std::distance()不会去操作迭代器beginIter的,beginIter在原位,但是遇到boost的filesystem::directory_iterator迭代器(不确定是否全boost如此),他把我迭代器给“用掉”了,想想也可以理解,迭代器不是平铺的数据,想得到俩迭代器的“距离”,势必做了个iter++操作

  template<typename _InputIterator>inline _GLIBCXX14_CONSTEXPRtypename iterator_traits<_InputIterator>::difference_type__distance(_InputIterator __first, _InputIterator __last,input_iterator_tag){// concept requirements__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)typename iterator_traits<_InputIterator>::difference_type __n = 0;while (__first != __last){++__first;++__n;}return __n;}

但是理论上你可以留个备份,然后给我恢复,不动我的输入才对。

这可能就和boost本身对迭代器的封装有关了。

也就是他distance的原理是让我的iter去++,最后去接近end,并且没给我备份恢复?

因为std::distance是模板操作,而迭代器是boost定义的,算是boost自己的问题,他不给副本,而走了智能指针,导致std::distance直接把iter给改掉了。

朴素的++iter操作,改变了boost的迭代器指向

结论就是避坑,单独给一个临时iter,或者别用stl接口去搞boost了。

或者问题根源在于:不要混用stl和boost

#include <boost/range.hpp>// ...std::vector<int> numbers{1, 2, 3, 4, 5};
auto range = boost::make_iterator_range(numbers);std::ptrdiff_t distance = boost::distance(range);

收回我刚才的话,不混用也没用,谨慎使用boost的迭代器,boost自己的distance函数一样改变了iter2的指向

如果有C++17,直接用C++的filesystem替代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/642208.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android系统更新ActivityManager中APi问题解决

遇到在alps/frameworks/base/core/java/android/app/ActivityManager.java 进行了新接口的增加时&#xff0c;需要进行更新api操作以刷新以下两文件。 alps/frameworks/base/core/api/system-current.txt alps/frameworks/base/core/api/system-lint-baseline.txt 否则会报错…

C++从零开始websevere服务器从搭建到上线|使用华为云服务器进行项目部署

文章目录 公网IP和私有IP地址公网IP私有IP地址为什么我们需要两个IP地址呢 云服务器设置防火墙配置基础配置云服务器防火墙配置云服务器安全组 总结 问题背景 关于使用华为云服务器进行项目部署&#xff0c;25届C秋招选手&#xff0c;刚写完一个websever项目&#xff0c;想着部…

8. 中断下半页 与 延迟处理

目录 中断下半页 软中断 Tasklet Work Queues 回顾一下 Reference (偷个懒&#xff1a;这里不将怎么用hhh) 我们现在开始考虑中断的部分了。我们直到处理设备&#xff08;不管是CPU自己的还是外部设备的&#xff09;的中断是操作系统的一个重要任务。 我们说中断是异步的…

柱状图展示异步统计数据

PC端 APP端 Controller层 package com.cnpc.dj.party.controller;import com.alibaba.fastjson.JSONObject; import com.cnpc.dj.common.JsonResult; import com.cnpc.dj.common.context.BaseContextHandler; import com.cnpc.dj.common.utils.DateUtils; import com.cnpc.dj.…

js的算法-交换排序(快速排序)

快速排序 基本思想 快速排序的基本思想是基于分治法的&#xff1a;在待排序表L【1...n】中任意取一个元素p 作为枢轴&#xff08;或基准&#xff0c;通常取首元素&#xff09;。通过一趟排序将待排序表划分为独立的两部分L【1...k-1】和L【k1...n】;这样的话&#xff0c;L【1…

【视觉论文】VIT - Vision Transformers

论文&#xff1a;AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 链接&#xff1a;https://arxiv.org/abs/2010.11929 很多人博主都写烂了的论文&#xff0c;我到现在才真正翻开论文看&#xff0c;21年的工作&#xff0c;正好是刚毕业那年&…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

使用autocannon和0x对网站进行性能分析(node)

npm i autocannon -g autocannon -c 100 -d 5 -p 10 http://localhost:3000/ 0x -o app.js 火焰图是根据程序的栈的状态对出现函数的采样数据统计而得&#xff0c;宽度代表函数运行一次所需的时长、高度代表栈的层数、颜色深度代表函数在采样中出现的频率&#xff0c;因此宽度…

Python-GEE遥感云大数据分析、管理与可视化

原文链接&#xff1a;Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

标准版/开源版 移动端新增页面使用文档

在标准版开发的实际使用中&#xff0c;随着用户移动端的产品和信息内容不断增多&#xff0c;新增页面来展示对应的产品详情、模块等内容。针对一些概念或者步骤较多的内容&#xff0c;可以新增子页面构建多级模块结构&#xff0c;帮助用户快速定位。 下面就如何新增页面做一讲…

2024深圳杯数学建模挑战赛B题:批量工件并行切割下料问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024B题&#xff1a;批量工件并行切割下料问题 板材切割下料是工程机械领域重要…

qmt教程1---qmt安装,提供下载链接

以前写的qmt不太完善现在重新好好的学习一下qmt&#xff0c;重新封装qmt&#xff0c;使用方便 1第一步下载qmt 点击安装 下一步 下一步 默认路径&#xff0c;安装完成 2登录qmt&#xff0c;选择行情加交易&#xff0c;选择极简模式 登录情况 我把qmt上线了 比如我们获取一分钟…