每日一题
无重复字符的最长子串
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;
}