第九章---for循环及在STL的应用(vector\map\set\list\for_each)、嵌套while、while 统一输出、do-while

news/2024/10/4 12:05:30/

在C++中,循环语句用于重复执行一段代码,直到指定的条件不再满足。C++ 提供了几种循环机制,下面将详细讲解每种循环语句的用法和特点。

1. for 循环

for 循环是最常用的循环结构之一,它有三种基本形式:

基本形式:
for (初始化表达式; 循环条件; 步进表达式) {// 循环体
}
  • 初始化表达式:在循环开始前执行,通常用于初始化循环变量。
  • 循环条件:每次循环开始前检查,如果为真(非零),则执行循环体。
  • 步进表达式:每次循环体执行后执行,通常用于更新循环变量。
示例:
for (int i = 0; i < 10; ++i) {std::cout << i << std::endl;
}

2. for 循环在STL(标准模板库)中的使用:

在C++的Standard Template Library(STL)中,for 循环广泛用于遍历各种容器(如 vector, list, deque, set, map 等)中的元素。以下是 for 循环在STL中应用的一些示例:

1. 遍历 vector

使用传统的 for 循环遍历 vector

#include <iostream>
#include <vector>
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};for (size_t i = 0; i < vec.size(); ++i) {std::cout << vec[i] << std::endl;}return 0;
}

使用基于范围的 for 循环

for (int val : vec) {std::cout << val << std::endl;
}
2. 遍历 map

使用迭代器遍历 map

#include <iostream>
#include <map>
int main() {std::map<std::string, int> map = {{"one", 1}, {"two", 2}, {"three", 3}};for (std::map<std::string, int>::iterator it = map.begin(); it != map.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}

使用基于范围的 for 循环(C++17起,需要结构化绑定):

for (const auto& [key, value] : map) {std::cout << key << ": " << value << std::endl;
}
3. 遍历 set

使用迭代器遍历 set

#include <iostream>
#include <set>
int main() {std::set<int> set = {1, 2, 3, 4, 5};for (std::set<int>::iterator it = set.begin(); it != set.end(); ++it) {std::cout << *it << std::endl;}return 0;
}

使用基于范围的 for 循环:

for (int val : set) {std::cout << val << std::endl;
}
list_78">4. 遍历 list

使用迭代器遍历 list

#include <iostream>
#include <list>
int main() {std::list<int> lst = {1, 2, 3, 4, 5};for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {std::cout << *it << std::endl;}return 0;
}

使用基于范围的 for 循环:

for (int val : lst) {std::cout << val << std::endl;
}
5. 使用 std::for_each 算法

除了常规的 for 循环,STL还提供了 std::for_each 算法,可以用于遍历容器并执行一个函数对象。

#include <iostream>
#include <vector>
#include <algorithm> // for std::for_each
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::for_each(vec.begin(), vec.end(), [](int val) {std::cout << val << std::endl;});return 0;
}

for 循环在STL中的应用非常广泛,能够帮助程序员以简洁和高效的方式处理容器中的数据。随着C++标准的更新,使用基于范围的 for 循环和结构化绑定等特性,可以进一步简化代码,提高代码的可读性和可维护性。

示例:
int arr[] = {1, 2, 3, 4, 5};
for (int i : arr) {std::cout << i << std::endl;
}

3. while 循环

while 循环在给定条件为真时,重复执行代码块。

语法:
while (条件) {// 循环体
}
示例:
int i = 0;
while (i < 10) {std::cout << i << std::endl;++i;
}
用途

while 循环适用于以下情况:

  • 当循环次数未知时。
  • 当需要在每次迭代之前检查循环条件时。
注意事项
  • 确保循环条件最终能够变为假,以避免无限循环。
  • 循环体内应有修改循环条件的语句,否则可能会造成无限循环。
  • 初始化循环变量和控制循环的条件通常在循环之前设置。
示例
int i = 0;
while (i < 10) {std::cout << i << std::endl;i++; // 更新循环条件
}

高级用法

1. 嵌套 while 循环

可以在 while 循环内部再嵌套一个或多个 while 循环,用于处理更复杂的问题。

int i = 0;
while (i < 5) {int j = 0;while (j < 5) {std::cout << "(" << i << ", " << j << ") ";j++;}std::cout << std::endl;i++;
}
2. 使用 breakcontinue

可以在 while 循环中使用 breakcontinue 来控制循环流程。

  • break 语句用于立即退出循环。
  • continue 语句用于跳过当前迭代剩余的部分,直接进入下一次迭代。
int i = 0;
while (i < 10) {i++;if (i == 5) {continue; // 跳过i等于5的情况}std::cout << i << std::endl;if (i == 8) {break; // 当i等于8时退出循环}
}
3. 无限循环

可以使用 while (true) 来创建一个无限循环,通常需要配合 break 语句来正确退出循环。

while (true) {// 执行一些操作if (/* 某个条件 */) {break; // 满足条件时退出循环}
}
4.使用 while 语句来处理输入并在输入完成后统一输出

通常,这种方法用于处理不确定数量的输入数据。下面是一个简单的示例,说明如何使用 while 循环来读取输入,然后在输入结束后输出所有读取的值。
假设题目要求读取一系列整数,直到输入为0为止,然后输出所有非零整数。

#include <iostream>
#include <vector>
int main() {int value;std::vector<int> values;// 使用while循环读取输入,直到输入为0while (std::cin >> value) {if (value == 0) {break; // 如果输入为0,则退出循环}values.push_back(value); // 将非零值添加到vector中}// 输出所有读取的值for (int v : values) {std::cout << v << " ";}std::cout << std::endl;return 0;
}

在这个例子中,while 循环会一直执行,直到输入流遇到文件结束符(EOF)或输入为0。如果输入为0,break 语句会终止循环。所有非零的整数都被存储在 vector 中,然后在循环结束后,使用 for 循环遍历并输出这些值。

总结

while 循环是C/C++中非常灵活的循环结构,适用于多种场景。理解和掌握 while 循环对于编写结构化和高效的代码至关重要。在使用时,要特别注意循环条件的管理,以避免出现逻辑错误或性能问题。

3. do-while 循环

do-while 循环与 while 循环类似,但它的条件检查是在循环体执行之后进行的,因此循环体至少执行一次。

语法:
do {// 循环体
} while (条件);
示例:
int i = 0;
do {std::cout << i << std::endl;++i;
} while (i < 10);

4. 循环控制语句

在循环内部,可以使用以下控制语句改变循环的执行流程:

  • break:立即退出循环。
  • continue:跳过当前循环的剩余部分,直接进入下一次循环的条件判断。
  • goto:跳转到指定的标签位置(不推荐使用,因为它可能导致代码混乱和难以维护)。

示例:使用 breakcontinue

for (int i = 0; i < 10; ++i) {if (i == 5) {break; // 当 i 等于 5 时,退出循环}if (i % 2 == 0) {continue; // 当 i 是偶数时,跳过本次循环的剩余部分}std::cout << i << std::endl; // 只打印奇数
}

循环语句是编程中的基本概念,理解和掌握它们对于编写高效的C++程序至关重要。


http://www.ppmy.cn/news/1534400.html

相关文章

electron教程(三)窗口设置

在main.js文件中&#xff0c;创建窗口时会设置窗口的大小&#xff0c;其实还有很多其他属性&#xff0c;可以根据实际需求选择设置&#xff0c;但部分属性存在局限性&#xff0c;官网也有明确告知&#xff1a;自定义窗口 | Electron (electronjs.org) 项目文件目录如下&#x…

【GPT】对低阶版本的GPT探测:文学

诗名字一致&#xff0c;GPT就分不清了&#xff0c;还要多喂喂书&#xff0c;之前部分技术类的协议解析可以直接扔整本书给他自我学习。 温庭筠 相见欢 ChatGPT 说&#xff1a; ChatGPT 《相见欢》是温庭筠的一首经典词作&#xff0c;以其细腻的情感和优美的意象而著称。以下是…

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

相机的内参 外参

相机的内参和外参是计算机视觉和摄影测量中的重要概念。以下是对它们的详细说明&#xff1a; 内参&#xff08;Intrinsic Parameters&#xff09; 内参定义了相机的内部特性&#xff0c;主要包括焦距、主点坐标以及畸变系数。内参矩阵 K 形式如下&#xff1a; 外参&#xf…

高级java每日一道面试题-2024年9月30日-服务器篇[Redis篇]-Redis持久化有几种方式?

如果有遗漏,评论区告诉我进行补充 面试官: Redis持久化有几种方式? 我回答: Redis 是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列和实时数据分析等场景。为了保证数据的持久性&#xff0c;Redis 提供了两种主要的持久化方式&#xff1a;RDB&#xff08;Redi…

构建高效服装销售平台:Spring Boot与“衣依”案例

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块

9月24日&#xff0c;2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上&#xff0c;中国信通院发布了2024年《高质量数字化转型产品及服务全景图&#xff08;上半年度&#xff09;》和《高质量数字化转型技术解决方案&#xff08;上半年度&#xff09;》等多项…

使用 PHP 的 strip_tags函数保护您的应用安全

在现代 web 开发中&#xff0c;处理用户输入是一项常见的任务。然而&#xff0c;用户输入的内容往往包含 HTML 或 PHP 标签&#xff0c;这可能会导致安全漏洞&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;。为了解决这个问题&#xff0c;PHP 提供了一个非常有用的函数…