【cpp八股】个人记录,持续更新
2025-8-1
emplace_back() 方法
功能:向 vector 容器的末尾添加元素
语法:vector对象.emplace_back(参数);
与 push_back 的区别:emplace_back直接在容器内存构造元素,而push_back先构造临时对象再移动 / 复制,效率更高
2025-8-10
explicit
在 C++ 中,explicit 是一个关键字,主要用于修饰类的构造函数,其作用是禁止隐式类型转换,只能进行显式类型转换
示例:
-
- 未使用 explicit 的情况(允许隐式转换)
class MyClass {
public:
int value;
// 单参数构造函数(未加explicit)
MyClass(int x) : value(x) {}
};
void func(MyClass obj) {
// 处理obj
}
int main() {
MyClass obj1(10); // 显式构造(正常)
MyClass obj2 = 20; // 隐式转换(允许,等价于 MyClass obj2(20))
func(30); // 隐式转换(允许,将30转换为MyClass对象)
return 0;
}
-
- 使用 explicit 的情况(禁止隐式转换)
class MyClass {
public:
int value;
// 单参数构造函数(加explicit)
explicit MyClass(int x) : value(x) {}
};
void func(MyClass obj) {
// 处理obj
}
int main() {
MyClass obj1(10); // 显式构造(正常)
MyClass obj2 = 20; // 错误!禁止隐式转换
func(30); // 错误!禁止隐式转换
func(MyClass(30)); // 显式转换(允许)
return 0;
}
注意事项
- explicit 仅对单参数构造函数有效(C++11 后也可用于多参数构造函数,但需配合默认参数)。
它的主要目的是避免意外的隐式转换,提高代码的可读性和安全性。
拷贝构造函数和移动构造函数通常不需要加 explicit,除非有特殊需求。
通过合理使用 explicit,可以防止代码中出现难以察觉的隐式转换错误,使程序行为更符合预期。
std::string_view
std::string_view 是 C++17 引入的一个轻量级量字符串视图类,主要用于高效地访问字符串数据而不需要复制。它可以看作是对已有字符串(如 std::string 或 C 风格字符串)的 "观察窗口",而非独立存储字符串数据。
核心特点:
- 非所有权:string_view 不拥有它所指向的字符串数据,只是保存了一个指向字符串起始位置的指针和长度信息。
- 零复制:创建 string_view 时不会复制原始字符串数据,因此比传递 const std::string& 更高效,尤其适合作为函数参数。
- 兼容性:可以从 std::string、C 风格字符串(const char*)或其他 string_view 构造而来。
- 不可修改:string_view 提供的接口只能读取字符串数据,不能修改其指向的内容(类似于 const char*)。
- 使用场景:
作为函数参数,避免不必要的字符串复制
需要频繁截取子字符串时(substr() 操作是 O (1) 时间复杂度)
处理大量字符串数据时提升性能
#include <string_view>
#include <iostream>
#include <string>
// 高效接收字符串参数,无需复制
void print_string(std::string_view sv) {
std::cout << sv << ", length: " << sv.size() << std::endl;
}
int main() {
std::string str = "Hello, world!";
const char* cstr = "C-style string";
// 从 std::string 创建
std::string_view sv1(str);
// 从 C 风格字符串创建
std::string_view sv2(cstr);
// 直接使用字符串字面量
std::string_view sv3 = "string literal";
print_string(sv1); // 输出: Hello, world!, length: 13
print_string(sv2); // 输出: C-style string, length: 13
print_string(sv3); // 输出: string literal, length: 14
// 高效截取子串(不复制数据)
std::string_view sub = sv1.substr(0, 5);
print_string(sub); // 输出: Hello, length: 5
return 0;
}
注意事项:
- 生命周期管理:必须确保 string_view 指向的原始字符串生命周期长于 string_view 本身,否则会导致悬垂指针(dangling pointer)。
- 不包含终止符:string_view 存储的是长度信息,不保证指向的字符串以 \0 结尾,因此使用 data() 时需注意。
- 适用场景:适合读操作,若需要修改字符串或存储字符串,仍需使用 std::string。
std::string_view 特别适合在性能敏感的场景中减少字符串复制带来的开销,是现代 C++ 中处理字符串的重要工具。
2025-8-17
vector 有多种构造函数,其中一种形式为:
vector(size_type n, const T& value);
- 第一个参数 n:指定初始时容器中元素的个数(即 size)。
- 第二个参数 value:指定每个元素的初始值。
例如,vectorpCount(26, 0); 的含义是:
创建一个存储 int 类型的 vector,名为 pCount。
初始时包含 26 个元素。
每个元素的初始值都是 0。

八股
浙公网安备 33010602011771号