当前位置: 首页 > article >正文

复原IP地址 什么是运算符重载? 如何在 C++ 中进行运算符重载?运算符重载在面向对象编程中的好处是什么?getline方法

getline方法

getline 是一个强大的函数,主要用于从输入流中按行读取数据或基于自定义分隔符提取字符串。它是 C++ 标准库的一部分,定义在头文件 <string> 中。

语法

std::getline(istream& input, std::string& str);

input:输入流对象(如 std::cinstd::ifstream)。

str:用于存储提取结果的字符串。

std::getline(istream& input, std::string& str, char delimiter);

delimiter:分隔符,默认为换行符 \n。可以指定其他字符作为分隔符。

93. 复原 IP 地址

记录中间结果最好直接作为参数直接传进去,使用临时数组存储push和pop操作很消耗时间

class Solution {
public:
    vector<string> ans; // 存储最终结果

    vector<string> restoreIpAddresses(string s) {
        dfs(0, 0, "", s); // 从第 0 段和第 0 个字符开始回溯
        return ans;
    }

    void dfs(int depth, int start, string mid, string& s) {
        // 当分割成 4 段时,检查是否遍历完整个字符串
        if (depth == 4) {
            if (start == s.size()) { // 必须刚好遍历完整个字符串
                mid.pop_back();
                ans.push_back(mid); // 保存结果
            }
            return;
        }

        // 尝试分割长度为 1 到 3 的字符串
        for (int i = 1; i <= 3; i++) {
            if (start + i > s.size())
                return; // 提前退出无效分割

            string str = s.substr(start, i);

            // 检查前导零
            if (str.size() > 1 && str[0] == '0')
                return;

            // 检查是否在合法范围内
            if (i == 3 && str > "255")
                return;

            // 递归分割下一段
            dfs(depth + 1, start + i, mid + str+".",s);
            // 回溯,撤销本次选择
        }
    }
};

什么是运算符重载? 如何在 C++ 中进行运算符重载?

C++中允许重载运算符,使得非基本数据类型也可以实现自定义的运算操作

基本规则
        必须是类的成员函数或友元函数:
                成员函数的左操作数是类对象自身。
                友元函数可访问私有成员,但不能直接访问类外的对象。
        不能重载的运算符:
                ::(域运算符)、sizeof、.*、.(成员访问运算符)、typeid。
        重载不改变运算符的优先级和结合性。
        支持的运算符可以重载为一元或二元形式。

语法:

class MyClass {
public:
    MyClass operator+(const MyClass& other); // 重载 +
};
  • 返回值类型:通常是与类相关的类型。
  • 参数:取决于操作数的数量。
  • 使用 operator 关键字后跟运算符来定义。
  • 在类中重载运算符*this作为隐式参数传入,所以可以省略一个参数 在类在重载运算符时需要传递两个参数

特殊的流运算符重载

#include <iostream>
using namespace std;

class Example {
    int value;
public:
    Example(int v) : value(v) {}
    friend ostream& operator<<(ostream& os, const Example& obj) {
        os << obj.value;
        return os;
    }
};

什么时候运算符重载的参数数量是可变的?

运算符重载的参数数量(固定或可变)影响其适用场景:

  • 固定数量:大部分运算符(如 +, -, [], = 等)参数数量固定,确保语义清晰。
  • 可变数量:函数调用运算符支持可变参数,增强了灵活性,可用于实现复杂逻辑(如仿函数或回调)。

函数调用运算符重载的作用:

用作泛型比较器:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <typename T>
class Compare {
public:
    bool operator()(T a, T b) {
        return a < b;
    }
};

int main() {
    vector<int> vec = {5, 2, 9, 1};
    sort(vec.begin(), vec.end(), Compare<int>());

    for (int v : vec) {
        cout << v << " ";
    }
    return 0;
}

 泛型比较器的实现方法

运算符重载在面向对象编程中的好处是什么?

  • 提高代码可读性,例如流输出运算符重载,可以直接使用<<自定义输出,免得需要额外定义一个print函数
  • 支持自定义行为
  • 符合面向对象的封装性


http://www.kler.cn/a/441333.html

相关文章:

  • PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践
  • 2024年记 | 凛冬将至
  • EtherCAT主站IGH-- 19 -- IGH之fsm_pdo.h/c文件解析
  • XSS 漏洞全面解析:原理、危害与防范
  • 立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口
  • BOM对象location与数组操作结合——查询串提取案例
  • 爬虫基础学习
  • 同轴共桨单兵微型无人机技术详解
  • 机器学习-多元线性回归
  • C# 入门编程
  • 使用C#获取有关磁盘驱动器的信息例如大小和可用空间
  • V少JS基础班之第二弹
  • 【基础】nginx简单配置
  • leetcode--mysql
  • HTMLCSS:3D卡片翻转悬停效果
  • 运维报错:SALV报错 CX_SALV_OBJECT_NOT_FOUND
  • PHP8.4下webman直接使用topthink/think-orm
  • 12.17双向链表,循环链表
  • LeetCode - #163 缺失的区间(会员题)
  • Base64在线编码解码 - 加菲工具
  • AngularJS 与 SQL 的集成应用
  • Electron-Vue 主进程远程调试 Webpack/Webstorm 打包配置细节记录
  • 后端-使用redis缓存菜品分类数据
  • 基于python快速部署属于你自己的页面智能助手
  • 说说你对canvas的理解
  • 构建一个rust生产应用读书笔记6-拒绝无效订阅者01