欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 实习冲刺Day27(移动语义,右值构造,无重复最长子串)

实习冲刺Day27(移动语义,右值构造,无重复最长子串)

2025/5/24 6:56:58 来源:https://blog.csdn.net/2301_78814687/article/details/143951456  浏览:    关键词:实习冲刺Day27(移动语义,右值构造,无重复最长子串)

算法题

无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)

采用滑动窗口思想

首先我们新建一个哈希表,存储字符与字符出现的次数,如果相同字符出现两次,那么该子串就是不合理的子串。

一开始left与right,都指向第一个字符,此时长度为0;

right依次向右移动,将abc存储进哈希表中。

当right继续向右移动,移动到b的位置

我们发现map[s[right]]>1,此时需要缩减左边,左边left+1,并且map[s[left]]-=1;

我们发现左端移动之后map[s[right]]>1还是大于1的,我们接着缩减左边

依次类推,左右指针进行来回滑动,达到我们想要的无重复最长子串。

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int>map;int left=0,sum=0;for(int right=0;right<s.size();right++){map[s[right]]++;while(map[s[right]]>1){map[s[left]]-=1;left+=1;}sum=max(sum,right-left+1);}return sum;}
};

基础知识

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

在 C++ 11 之前,对象之间的赋值(如通过拷贝构造函数或赋值运算符)是通过拷贝的方式进行的。

C++11引入的新特性,允许将一个资源从一个对象转移到另一个对象,而不是传统意义上的拷贝操作。

有一个类,包含一个数组,在对象拷贝的时候需要将一个资源从一个对象复制到另一个对象,这涉及资源的分配问题,与数据的复制问题,C++11引入了移动语义,将资源直接从一个对象转移到另一个对象,移动语义主要是通过右值引用(&&)来实现的。右值引用可以绑定到将要销毁的对象

(即右值),这些对象的值可以被 “窃取”。

移动语义的作用
  1. 提高性能:拷贝操作可能会非常耗时和占用大量内存。移动语义避免了不必要的拷贝,从而显著提高了程序的性能。
  2. 资源管理优化:它使得资源的所有权能够更高效地在对象之间转移。
  3. 更灵活的编程模式:移动语义与 C++ 11 中的其他新特性(如智能指针、lambda 表达式等)协同工作,使得代码可以更加高效和灵活地处理对象的生命周期和资源管理。

右值引用是什么?

右值与左值

有名字能找到地址的是左值,int a,a就是一个左值

没有名字找不到地址的就是右值,int a=2 2就是一个右值

右值引用

左值引用只能引用左值,右值引用只能引用右值

右值引用是 C++ 11 引入的一种新的引用类型,用&&表示。它主要用于绑定到右值,使得可以对右值进行修改或者延长其生命周期。例如,int&& r = 5;,这里r是一个右值引用,它绑定到了右值5。

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

移动构造函数是一种特殊的构造函数,它接受一个右值引用作为参数。其目的是将被引用对象的资源 “移动” 到新构造的对象中,而不是进行拷贝。

class String {
private:char* data;size_t length;
public:// 移动赋值运算符String& operator=(String&& other) {if (this!= &other) {delete[] data;data = other.data;length = other.length;other.data = nullptr;other.length = 0;}return *this;}// 其他成员函数(如拷贝构造函数、析构函数等)
};

在移动赋值运算符中

  1. 首先检查是否是自我赋值(this!= &other)。
  2. 如果不是自我赋值,就释放当前对象的资源(delete[] data)然后将other对象的资源移动过来(data = other.data; length = other.length;),并将other对象置为安全状态(other.data = nullptr; other.length = 0;),
  3. 最后返回当前对象的引用(return *this;)。

这样就通过右值引用实现了移动语义,使得在合适的场景下(如函数返回值、临时对象赋值等)可以高效地转移资源,避免不必要的拷贝。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词