string模拟实现find
个人主页:Jason_from_China-CSDN博客
所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客
所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客
string模拟实现find
查找分为查找字符和查找字符
查找字符的实现:
//find查找字符+find查找字符串(strstr暴力查找)size_t string::find(char ch, size_t pos){for (size_t i = pos; i < _size - pos; i++){if (_str[i] == ch)return i;}return npos;}
代码解释:
- 这里查找字符我们采取的是暴力查找,找到了,直接返回找到的下标,没找到直接返回npos,也就是一个很大是数值
查找字符串的实现:
查找字符串我们可以使用一个库函数来实现,暴力实现的讲解有点复杂,所以我们直接使用strstr的函数实现
size_t string::find(const char* str, size_t pos) {assert(pos >= 0 && pos <= _size);const char* ptr = strstr(_str + pos, str);if (ptr == nullptr){return npos;}else{//正确计算位置索引:ptr是在_str + pos所指向的内存区域中找到子字符串str时的指针。通过ptr - _str,可以计算出子字符串在整个_str字符串中的起始索引位置。//将指针ptr强制转换为size_t类型并返回,并没有实现find函数预期的功能。find函数的目的是返回子字符串在原字符串中的位置索引(一个基于 0 开始的偏移量),而不是指针值的数值表示。//简单的说就是,这个ptr是指针类型,但是我们这个函数的接口是size_t类型//所以我们需要转化为size_t类型的,但是还不能直接强制类型转化//因为指针强制类型转换计算偏移量是从0开始是,所以就会导致报一个很大的数值//我们需要计算偏移量,那么我们知道的偏移量就是_str首元素的地址也就是0//此时任何数值-0都等于那个数值本身,所以我们计算出结果。return ptr-_str;} }
代码解释:
- 这里的关键在于,strstr的数值的接收,这里返回的是一个指针,但是我们的返回值一个是一个size_t类型的
- 此时就会产生无法返回的情况,那么我们就有两种解决办法,要么是强制类型转换,要么是减去相对地址
- 但是强制类型转化的行不通的,因为我们强制类型转换的时候,我们拿到的是绝对地址,但是实际上我们需要的是相对地址
- 所以我们需要ptr-_str这个是ptr-0,也就是得出相对地址位置