每日一题&移动语义

每日一题

无重复字符的最长子串

cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        /*
        利用set的特性,set中不能有重复的元素,
        所以可以用set来判断是否有重复的元素
        然后用两个指针i和j来表示子串的左右边界,
        然后用ans来记录最长的子串的长度,
        当j指向的元素不在set中时,就将j指向的元素加入set中,
        然后j++,ans=max(ans,j-i),
        当j指向的元素在set中时,就将i指向的元素从set中删除,
        然后一直i++,直到j指向的元素不在set中,
        */
        set<int> a;
        int i = 0, j = 0;
        int ans = 0;
        while(i<s.size()&&j<s.size()){
            if(a.find(s[j])==a.end()){
                a.insert(s[j++]);
            }else{
                a.erase(s[i++]);
            }ans = max(ans,j-i);
        }
        return ans;
    }
};

什么是 C++ 中的移动语义?它的作用是什么?

移动语义是C++11提供的一种新的机制,可以高效的处理资源之间的传递,当我们需要将一个对象赋值给另一个对象,然后赋值的那个对象也不再使用,就可以使用移动语义,这时编译器会把赋值对象的资源的拥有权直接给被赋值的对象,这样就避免了没有意义的拷贝操作。当处理大型的对象的时候可以显著提高性能。

右值引用是什么?如何使用右值引用实现移动语义?

右值引用是一种新的引用类型,在 C++ 11 之前,只有左值引用(&),左值引用主要用于绑定到左值(具有名字的对象、可以在表达式左边的对象等)。右值引用使用&&来表示,它主要用于绑定到右值,右值是临时对象或者即将销毁的值,如函数返回的临时对象、字面量等。

使用右值引用实现移动语义:

cpp 复制代码
class MyClass {
public:
    // 移动构造函数
    MyClass(MyClass&& other) {
        // 假设MyClass中有一个指针成员data指向动态分配的内存
        this->data = other.data;
        other.data = nullptr;
    }
private:
    int* data;
};

移动赋值运算符:

类似地,移动赋值运算符operator =也可以定义为接受右值引用。它用于将一个右值对象的资源移动到当前对象。例如:

cpp 复制代码
MyClass& MyClass::operator=(MyClass&& other) {
    if (this!= &other) {
        delete[] this->data;
        this->data = other.data;
        other.data = nullptr;
    }
    return *this;
}
相关推荐
猎板PCB厚铜专家大族16 分钟前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man27 分钟前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel27 分钟前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso1 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM1 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师2 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl2 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康2 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康2 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting