本文主要记录一些使用过程中对语法的理解。
lambda表达式:#
Lambda 表达式是 C++11 引入的一种新特性,它使得编写内联匿名函数更加简洁和灵活。Lambda 表达式不仅能捕获局部变量,还能创建函数闭包。以下是 Lambda 表达式的语法和功能的详细解释。
Lambda 表达式的基本语法#
Lambda 表达式的基本形式如下:
1 | [capture](parameters) -> return_type { |
- **
capture
**:捕获列表,用于捕获作用域中的变量。 - **
parameters
**:参数列表,与普通函数的参数列表相同。 - **
return_type
**:返回类型,可以省略,如果编译器能自动推断返回类型。 - **
function body
**:函数体,包含 Lambda 表达式执行的代码。
示例#
基本 Lambda 表达式
1 |
|
带捕获列表的 Lambda 表达式
1 |
|
带返回类型的 Lambda 表达式
1 |
|
捕获方式#
捕获列表可以包含局部变量,通过以下几种方式捕获:
- 按值捕获(默认):捕获外部变量的副本。
- 按引用捕获:捕获外部变量的引用。
- 隐式捕获:根据上下文自动捕获变量,可以是按值或按引用。
示例:按值捕获
1 |
|
示例:按引用捕获
1 |
|
示例:隐式捕获
1 |
|
函数闭包#
Lambda 表达式可以捕获外部变量,并在 Lambda 表达式生命周期内保持其状态,这就形成了函数闭包。函数闭包在一些高级编程场景中非常有用,如回调函数、事件处理等。
示例:创建函数闭包
1 |
|
捕获所有外部变量(C++14 引入)#
在 C++14 中,可以使用 [=]
或 [&]
捕获所有外部变量,或者使用 [*this]
捕获当前对象:
1 |
|
cin:#
在C++中,cin
是标准输入流,用于从控制台读取输入数据。理解cin
的使用规则以及其他输入方法的细节,对写出健壮的C++程序至关重要。下面将详细讲解cin
的规则以及其他常用的输入方法。
1. cin
的基本规则#
按空白字符分割输入:
cin
会自动跳过空白字符(如空格、换行符、制表符),并将输入内容按空白字符分割。每次读取的内容是一个“词”(word),即一段不包含空白字符的连续字符序列。1
2int a, b;
cin >> a >> b;如果输入为
3 4
,则a
得到3
,b
得到4
。处理换行符: 当用户按下
Enter
键后,输入结束。cin
会处理到换行符前的输入,换行符本身会被保留在输入缓冲区中。读取字符串: 当用
cin >>
读取字符串时,cin
会读取直到第一个空白字符为止的内容。例如:1
2string str;
cin >> str;如果输入为
Hello World
,则str
得到Hello
,World
会留在输入缓冲区。
2. cin
的常见问题#
处理剩余的输入: 如果读取整数、浮点数或字符后输入缓冲区中还有未处理的内容(如换行符),可能会影响后续的输入操作。可以使用
cin.ignore()
或cin.get()
来清空缓冲区。1
2
3int x;
cin >> x;
cin.ignore(); // 忽略缓冲区中剩余的字符,通常是换行符输入验证:
cin
不会自动验证输入的有效性。若输入的类型不匹配,cin
会进入错误状态,无法继续读取输入,必须清除错误状态并清空输入缓冲区。1
2
3
4
5
6int num;
cin >> num;
if (cin.fail()) { // 检查是否发生错误
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 丢弃当前行
}
3. 其他输入方法#
cin.get()
: 读取单个字符,包括空白字符。常用于读取字符或者处理输入缓冲区中的换行符。1
2char ch;
cin.get(ch);- 读取一行字符: 可以使用
cin.getline()
读取一整行输入,包括空格。
1
2char line[100];
cin.getline(line, 100); // 从输入读取最多100个字符,遇到换行符结束- 读取一行字符: 可以使用
getline(cin, string)
: 读取一行输入并存入字符串对象string
中,读取直到换行符。1
2string line;
getline(cin, line);与
cin >>
相比,getline
不会忽略空格,适用于读取整行的输入。scanf
: C语言的输入函数,提供了更灵活的格式化输入控制。常用于精确控制输入格式。1
2int a, b;
scanf("%d %d", &a, &b);使用
scanf
时需要特别注意匹配输入的格式符。fgets
: C语言函数,读取一行输入并存储在字符数组中,常用于读取较长或者包含空格的输入。1
2char buffer[100];
fgets(buffer, 100, stdin); // 从标准输入读取最多100个字符
4. 注意事项#
混用
cin
和getline
: 在使用cin
读取数据后再用getline
读取字符串时,可能需要先调用cin.ignore()
来清除输入缓冲区中残留的换行符。1
2
3
4
5int num;
cin >> num;
cin.ignore(); // 清除换行符
string line;
getline(cin, line); // 现在可以正确读取整行输入处理输入错误:当
cin
遇到类型不匹配时,会进入错误状态,必须调用cin.clear()
清除错误状态并使用cin.ignore()
清除缓冲区中的无效输入。使用循环读取输入: 在某些情况下,可以使用循环不断读取输入,直到遇到特定条件(如EOF或特定字符)为止。
1
2
3
4string input;
while (getline(cin, input)) {
// 处理每一行输入
}
5. 总结#
cin
主要用于基本的格式化输入,而getline
适用于读取整行文本。使用cin.get()
或cin.ignore()
可以处理输入缓冲区中的字符和换行符。- **
scanf
和fgets
**是C语言中的输入方法,提供了更加灵活的输入控制,但在C++中通常优先使用cin
和getline
。 - 混合使用输入方法时,需要注意缓冲区的管理,避免意外的行为。
通过理解这些输入方法及其细节,可以更好地处理用户输入,写出更加健壮和高效的C++程序。