VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 711|回复: 5

[已解决]求助,for循环的语法。。。

[复制链接]
38_avatar_middle
最佳答案
0 
在线会员 发表于 2022-7-4 05:10:36 | 显示全部楼层 |阅读模式
求助,for循环的语法。。。
求助,for循环的语法。。。
遍历目录,批量修改文件名,学习了几个月了。
终于可以用自己能够理解的方法写出程序来了。。。
  1. #include <iostream>
  2. #include<filesystem>
  3. #include <regex>
  4. using namespace std;

  5. filesystem::path make_name(filesystem::path url,wstring str)
  6. {
  7.     wregex pattern(L".*[::](.+)[((]国.*");
  8.     wstring result = regex_replace(str, pattern, L"$1.mp4");
  9.     url += L'\\';
  10.     url += result;
  11.     return url;
  12. }
  13. void traverseDirectory(filesystem::path url)
  14. {
  15.     if (!filesystem::exists(url))
  16.     {
  17.         cout << "当前目录不存在" << endl;
  18.     }
  19.     else
  20.     {
  21.         filesystem::directory_iterator list(url);
  22.         for (auto v : list)
  23.         {
  24.             rename(v.path(), make_name(url, v.path().filename()));
  25.         }
  26.     }
  27. }
  28. int main()
  29. {
  30.     traverseDirectory("C:\\Users\\Administrator\\Desktop\\JJDown\\Download");
  31.     return 0;
  32. }
复制代码


求助,for循环的语法。。。
但是程序中,还有一处,for循环的语法不能理解。。。。
第23行中。for循环括号中应该有3个表达式呀, 为什么这个for循环括号中只有一个表达式。。。

程序测试目录文件夹
求助,for循环的语法。。。 JJDown.rar (2.56 KB, 下载次数: 1)




上一篇:站长教程代码求助
下一篇:Visual Assist如何卸载干净
17_avatar_middle
最佳答案
37 
在线会员 发表于 2022-7-4 13:02:54 | 显示全部楼层
就是个遍历迭代器啊。你看成这样可能好理解点:
  1.                 filesystem::directory_iterator  itEnd = end(list);
  2.                 for (filesystem::directory_iterator itBegin = begin(list); itBegin != itEnd; itBegin++)
  3.                 {
  4.                         cout << (*itBegin).path().filename() << endl;
  5.                 }
复制代码
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-7-4 18:46:26 | 显示全部楼层
yoobaby 发表于 2022-7-4 13:02
就是个遍历迭代器啊。你看成这样可能好理解点:

只知道
for(表达式1; 表达式2; 表达式3)

不理解,是如何循环的
for (auto v : list)
12_avatar_middle
最佳答案
0 
在线会员 发表于 2022-7-5 16:22:44 | 显示全部楼层
//auto自动推导, C++11增加的功能,推荐普通数据类型、各种迭代器、函数返回值(C++14)等。
auto num = 1; //鼠标放在num上会显示num的实际类型
auto pi = 3.1415926; //鼠标放在pi上会显示pi的实际类型
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-7-6 00:19:22 | 显示全部楼层
WhoAmI. 发表于 2022-7-5 16:22
//auto自动推导, C++11增加的功能,推荐普通数据类型、各种迭代器、函数返回值(C++14)等。
auto num = 1; ...

不理解,只知道for(表达式1; 表达式2; 表达式3)
一个auto类型。就可以,变成3个表达式吗。。。
95_avatar_middle
最佳答案
1 
在线会员 发表于 2022-7-6 08:05:48 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 未觉之先 于 2022-7-6 08:11 编辑

for(auto i: v)遍历容器元素

    1. auto
    2. auto&
    3. const auto&
    4. const auto

C++11 新增了一种循环:基于范围(range-based)的 for 循环。这简化了一种常见的循环任务:对数组(或容器类,如 vector 和 array)的每个元素执行相同的操作,如下例所示:

double prices[5] = {4.99, 10.99, 6.87, 6.47, 8.88};
for (double x : prices)
        std::cout << x << std::endl;

  

其中, x x x 最初表示数组 prices 的第一个元素。显示第一个元素后,不断执行循环,而 x x x 依次表示数组的其他元素。因此,该循环可以用来显示数组中的每个值。

要修改数组的元素,需要使用不同的循环变量语法:

for (double &x : prices)
        x = x * 0.80; //20% off sale

   

符号 & 表明 x x x 是一个引用变量,能让接下来的代码能够修改数组的内容,而第一种语法不能。

还可结合使用基于范围的 for 循环和初始化列表:

for (int x : {3, 5, 2, 8, 6})
        cout << x << " ";
cout << '\n';

   

这种方式可以引申至 C++11 的另一种新特性 auto,使用 auto 遍历容器的方式,有以下几种:
1. auto

auto 即 for(auto x: range) 这样会拷贝一份 range 元素,而不会改变 range 中元素;
2. auto&

当需要修改range中元素,用 for(auto& x: range);
3. const auto&

当只想读取 range 中元素时,使用 const auto&,如:for(const auto&x:range),它不会进行拷贝,也不会修改range;
4. const auto

当需要拷贝元素,但不可修改拷贝出来的值时,使用 for(const auto x:range),避免拷贝开销。

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
    int a[] = { 1,2,3,5,2,0 };
    vector<int>counts(a,a+6);
    for (auto count : counts)
        cout<< count<< " ";
    cout << endl;
    return 0;
}
//输出:1 2 3 5 2 0

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-10-4 23:51

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表