记录自己碰到的一些cpp知识点,每次用都要查,然后我还得自己用个例子测试下,手动记一下省的每次都弄。今天想试着刷刷lc结果一道题得查很多知识点,费劲三小时,当然其中还有我玩手机各种转移注意力,一道简单的双指针的题,我之前很少用迭代器,今天顺着程序走了一通看着伪代码很简单的东西但是想了半天,希望下次能快一点相通
substr
// substr的第一个参数是数组位置,第二个参数是截取的字符长度
// string substr (size_t pos = 0, size_t len = npos) const;
string test = "teststrsubstr";
string tempStr2 = test.substr(0, 1); // 截取字符串的第一个字符
InputIterator find (InputIterator first, InputIterator last, const T& val)
返回值,当查找到时,返回查找到的第一个元素的迭代器,没找到则返回last,
std::distance(i, j)
记录两个迭代器之前的元素个数,参数为两个迭代器,这种涉及迭代器的元素区间一般都是[)
C++17的if初始化器
int lengthOfLongestSubstring(string s) {
int maxLen = 0;
if (s.size() == 0)
return maxLen;
// 思路,双指针,i指向队列左节点,j指向队列右节点
// 默认每次循环都令j增加,左节点仅在当有重复字符时增加
// 循环结束条件一般是右指针遍历到字符串末尾
maxLen++;
for (auto i = s.begin(), j = i + 1; i != s.end(), j != s.end(); j++) {
//如果找到该元素,剔除第一个,令左指针移动,初始化的语法如下,it迭代器的作用域在以下ifelse中皆可使用
if (auto it = find(i, j, *j);it != j)
{
// 找到了该元素,令i指向该元素+1的位置
i = ++it;
}
// 如果找到的元素不存在,find应该会返回处于j的迭代器
else
{
int count = std::distance(i, j)+1;
if (maxLen < count)
{
maxLen = count;
}
}
}
return maxLen;
}