【cpp八股】个人记录,持续更新

2025-8-1

emplace_back() 方法
功能:向 vector 容器的末尾添加元素
语法:vector对象.emplace_back(参数);
与 push_back 的区别:emplace_back直接在容器内存构造元素,而push_back先构造临时对象再移动 / 复制,效率更高

2025-8-10

explicit

在 C++ 中,explicit 是一个关键字,主要用于修饰类的构造函数,其作用是禁止隐式类型转换,只能进行显式类型转换

示例:

    1. 未使用 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;
}
    1. 使用 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:指定每个元素的初始值。
    例如,vector pCount(26, 0); 的含义是:

创建一个存储 int 类型的 vector,名为 pCount。
初始时包含 26 个元素。
每个元素的初始值都是 0。

posted @ 2025-08-01 11:25  Civilight~Eterna  阅读(10)  评论(0)    收藏  举报