getline方法
getline
是一个强大的函数,主要用于从输入流中按行读取数据或基于自定义分隔符提取字符串。它是 C++ 标准库的一部分,定义在头文件 <string>
中。
语法
std::getline(istream& input, std::string& str);
input
:输入流对象(如 std::cin
或 std::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函数
- 支持自定义行为
- 符合面向对象的封装性