在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;
}
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. 使用 break
和 continue
可以在 while
循环中使用 break
和 continue
来控制循环流程。
-
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循环读取输入,直到输入为0
while (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
:跳转到指定的标签位置(不推荐使用,因为它可能导致代码混乱和难以维护)。
示例:使用 break
和 continue
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++程序至关重要。