水题收获
STL标准库查找函数
find函数
二分查找,binary_search函数
目的:查找某元素是否存在于数组,存在返回1,不存在返回0.
binary_search(arr[],arr[]+size,target)
-
arr[]:数组首地址
-
size:数组元素个数
-
target:查找的元素
lower_bound函数
目的:在前闭后开区间进行查找返回第一个大于或等于某元素的位置(是一个地址,如果所有元素都小于目标元素,会返回最后一个位置
lower_bound(arr[],arr[]+size,target)
-
arr[]:数组首地址
-
size:数组元素个数
-
target:查找的元素
upper_bound函数
目的:在前闭后开区间进行查找返回第一个大于某元素的位置(是一个地址,如果所有元素都小于目标元素,会返回最后一个位置,这个返回的位置是越界的
upper_bound(arr[],arr[]+size,target)
-
arr[]:数组首地址
-
size:数组元素个数
-
target:查找的元素
map和undered_map
undered_map其实就是一种Hash的存储方式,是一种无序关联式容器,里面的元素以类似这种方式存储:
{key:value},如:{"张三":1, "李四":2}
map初始化
- C++ 11的初始化方法
map<int,string> m = {
{3,"hello"},
{4,"world"},
};
- 函数的初始化方法
map<int,int> create_map()
{
map<int,int> m;
m[1] = 2;
m[3] = 4;
m[5] = 6;
return m;
}
map<int,int> m = create_map();
C++ 输入问题
程序的输入是有一个缓冲区的,每次键盘输入结束后会先把输入的数据存储在缓冲区。
cin函数是直接从缓冲区获取数据的,所以当缓冲区有残留数据时cin会直接读取残留数据而不是键盘请求。
cin.getline()
作用:读取一行字符串,第一次多输入的数据会存储在缓冲区,如换行符
可以在此句后面加上cin.get()将空格读取掉
用法:
-
- string s;
- getline(cin, s);
-
- char sa[30];
- cin.getline(sa, 20, ' ') // 第三个是结束符,默认为换行
cin
直接读取数据,在遇到空格,换行时会停止读入,结束符(空格,换行)会被丢弃而不是存入缓冲区
cin.get(参数1:数组名,参数2:长度,参数3:结束符)
在遇到换行时会结束输入,但却并不会丢弃缓冲区中的Enter。
读取字符有两种方法:
-
char c = cin.get()
-
cin.get(c)
char c1, c2;
cin.get(c1);
cin.get(c2);
cout<<c1<<" "<<c2<<endl; // 打印两个字符
结果:
- 输入 a和回车
- 结果 先输出a在输出一个换行
读取字符串的方法:
会丢弃缓冲区中的Enter或空格但是不会丢弃自定义的结束符
char ch, a[20];
// 只会保存4个字符
cin.get(a, 5 , 'd');
cin>>ch;
cout<<a<<endl;
- 输入12d45回车
- 输出1234 d
因为cin.get(a,5,'d')遇到d停止输入,但是自定义标识符被缓存到缓存区,所以第二次直接读取缓存,输出d
cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
但是cin.get()当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。