问题出自:PAT B组 1053
find - C++ Reference (cplusplus.com)
测试代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int arr[5] = { 0,1,2,3,4 };
int* pos;
//find的返回值是指针类型!!!
cout << "数组首地址解引后数据: " << *arr << endl;
cout << "数组首地址+2后的地址解引后数据: " << arr + 2 << endl;
pos = find(arr, arr + 5, 2);
cout << "数组中第一个整型2所在地址: " << pos << endl;
//目标在数组的下标 注意,数组从0开始
cout << "将find函数找到的地址解引: " << *pos << endl;
}
经历初步尝试后,可以得出结论:
1.find函数基本写法:
头文件: #include<algorithm>
声明pos为寻找目标的指针类型
pos = find(arr, arr+n, tag);
注: 似乎还有一种写法: arr.find(tag)
这种写法的缺陷:
1.find函数的返回值必须与被搜索数组的类型相同
2.当搜索失败时,返回值难以被其他操作使用
适用于这种写法的小技巧:
当成功找到并返回一个地址后,想使用改地址作为for循环的分界线时,可以使用两种分界方式:
样例: char num[10][10]; char* pos;
1.地址分界
for(int i = 0; i < 10; i++)
if (num + i > pos);
2.下标分界
for(int i=0;i<10;i++)
if (i > pos - num);
另一种写法引入:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int arr[5] = { 0,1,2,3,4 };
int* pos;
//find的返回值是指针类型!!!
cout << "数组首地址解引后数据: " << *arr << endl;
cout << "数组首地址+2后的地址解引后数据: " << arr + 2 << endl;
pos = find(arr, arr + 5, 2);
cout << "数组中第一个整型2所在地址: " << pos << endl;
//目标在数组的下标 注意,数组从0开始
cout << "将find函数找到的地址解引: " << *pos << endl;
pos = find(arr, arr + 5, 9);
cout << pos << " " << *pos << endl;
/*char a[9][5];
int pos = a[2].find('o');*/
string a[9];
cin >> a[2];
//如果使用char类型的find声明写法,会出现两个错误
int pos1 = find(a[2],a[2]+2,'o');
cout << "pos1 = " << pos1 << endl;
}
该写法第一次尝试的报错及第一种写法的奇怪返回值:
正确写法:
string a[9];
cin >> a[2];
int pos1 = a[2].find('o');
cout << "pos1 = " << pos1 << endl;
未找到将返回-1
注意: 这种写法仅使用于类模板的查找,在c++中,string即为系统创建的类模板
也就是说,char num[10][10]; 尽管表示上与string[10]大致相同,但也无法使用这种写法
也有可能是我不知道,其实可以这么写