1.size_t
`size_t` 是一种在C/C++编程中非常常用的数据类型,它定义在`<stddef.h>`或者`<cstdlib>`等头文件中,通常用来表示**大小**或**长度**。
### 关键特性:
1. **无符号类型**:`size_t` 是无符号整数类型,表示它只能存储非负整数。因此,它不会用于存储负值,这使得它非常适合表示诸如数组大小、内存块大小等这些不能为负数的值。
2. **与平台相关**:`size_t` 的大小是**平台相关**的。在32位系统上,它通常是一个32位无符号整数(可以表示的范围是 0 到 2^32 - 1),而在64位系统上,它通常是一个64位无符号整数(可以表示的范围是 0 到 2^64 - 1)。这意味着它能够根据系统架构提供足够的存储空间,确保它能表示足够大的数据大小。
3. **用于内存和容器大小**:它通常用于描述数组、容器的大小或长度,比如标准库中的`std::vector::size()`函数返回值就是`size_t`类型。同样地,`malloc()`或`sizeof()`等函数也返回`size_t`类型。
### 示例:
`size_t` 是一种在C/C++编程中非常常用的数据类型,它定义在`<stddef.h>`或者`<cstdlib>`等头文件中,通常用来表示**大小**或**长度**。
### 关键特性:
1. **无符号类型**:`size_t` 是无符号整数类型,表示它只能存储非负整数。因此,它不会用于存储负值,这使得它非常适合表示诸如数组大小、内存块大小等这些不能为负数的值。
2. **与平台相关**:`size_t` 的大小是**平台相关**的。在32位系统上,它通常是一个32位无符号整数(可以表示的范围是 0 到 2^32 - 1),而在64位系统上,它通常是一个64位无符号整数(可以表示的范围是 0 到 2^64 - 1)。这意味着它能够根据系统架构提供足够的存储空间,确保它能表示足够大的数据大小。
3. **用于内存和容器大小**:它通常用于描述数组、容器的大小或长度,比如标准库中的`std::vector::size()`函数返回值就是`size_t`类型。同样地,`malloc()`或`sizeof()`等函数也返回`size_t`类型。
### 示例:
`size_t` 是一种在C/C++编程中非常常用的数据类型,它定义在`<stddef.h>`或者`<cstdlib>`等头文件中,通常用来表示**大小**或**长度**。
### 关键特性:
1. **无符号类型**:`size_t` 是无符号整数类型,表示它只能存储非负整数。因此,它不会用于存储负值,这使得它非常适合表示诸如数组大小、内存块大小等这些不能为负数的值。
2. **与平台相关**:`size_t` 的大小是**平台相关**的。在32位系统上,它通常是一个32位无符号整数(可以表示的范围是 0 到 2^32 - 1),而在64位系统上,它通常是一个64位无符号整数(可以表示的范围是 0 到 2^64 - 1)。这意味着它能够根据系统架构提供足够的存储空间,确保它能表示足够大的数据大小。
3. **用于内存和容器大小**:它通常用于描述数组、容器的大小或长度,比如标准库中的`std::vector::size()`函数返回值就是`size_t`类型。同样地,`malloc()`或`sizeof()`等函数也返回`size_t`类型。
### 需要注意的事项:
- 由于`size_t`是无符号类型,在与有符号类型进行比较或运算时需要小心,因为无符号和有符号混合运算可能会导致意想不到的结果(例如,负数可能会被转换为一个非常大的正数)。
2. a.at(i)
`a.at(i)` 是 C++ 中用于访问字符串 `a` 的第 `i` 个字符的语法。与 `a[i]` 类似,它可以用来获取字符串中的元素,但两者之间有一些重要区别。
### `a.at(i)` 与 `a[i]` 的区别:
(1). **边界检查**:
- `a.at(i)` 进行**边界检查**,如果 `i` 超过了字符串的长度,会抛出一个 `std::out_of_range` 异常,确保你不会意外访问无效的内存区域。
- `a[i]` 不会进行边界检查,如果 `i` 超过了字符串的有效范围,结果是未定义行为(通常会导致错误或程序崩溃)。
(2). **使用场景**:
- `a.at(i)` 更安全,适合在需要防止越界访问时使用(例如在编写鲁棒的代码时)。
- `a[i]` 更快,因为它没有边界检查,所以当你确定不会越界时,可以使用这种方式来获得更好的性能。
3.reverse(a.begin(), a.end());
`reverse(a.begin(), a.end());` 是 C++ 标准库中的一个函数,用于**反转容器(如字符串、数组、向量等)的内容**。在这里,它反转字符串 `a` 的所有字符,使第一个字符变成最后一个,最后一个字符变成第一个。
### 详细解释:
- `a.begin()`:返回指向字符串 `a` 第一个字符的迭代器。
- `a.end()`:返回指向字符串 `a` **末尾之后**(即最后一个字符的下一个位置)的迭代器。
`reverse(a.begin(), a.end());` 的作用是将从 `a.begin()` 到 `a.end()` 之间的所有字符**就地反转**。反转后的字符串 `a` 会直接被修改。
### 工作原理:
- `reverse()` 函数从容器的两端开始,逐个交换首尾对应的元素,直到中间为止。例如,`hello` 在经过反转后,`h` 和 `o` 交换,`e` 和 `l` 交换,得到 `olleh`。
### 需要包含的头文件:
要使用 `reverse()` 函数,需要包含头文件:
#include <algorithm>
4.size(), length()
在 C++ 中,`size()` 和 `length()` 是用于获取字符串长度的两个函数。对于 `std::string` 来说,这两个函数的功能是**完全相同的**,并且可以互换使用。
### 具体解释:
- **`size()`**:返回字符串中字符的数量,包含所有的可见字符和空白符。
- **`length()`**:同样返回字符串中的字符数量。
### 主要区别:
- **语义上的区别**:`size()` 更符合容器类的命名习惯,因为 `std::string` 是一个容器类型(就像 `std::vector` 一样),而 `length()` 更符合字符串的直观描述(字符串长度)。
- **来源背景**:`size()` 是从 STL(标准模板库)容器而来的,适用于所有容器类型。而 `length()` 更贴近处理文本的直观用法,通常和字符串相关的语言或库里使用。
5.三元运算符
(condition) ? (value_if_true) : (value_if_false);
condition
:一个条件表达式。如果条件为true
,就会执行 value_if_true
,否则执行 value_if_false
。