研究生机试C++算法中常用函数

1. string

  • string.find(string a, pos) a是子字符串,pos是查找开始的位置,不填的话默认为0,这里要注意,如果不存在要找到东西,则返回的是string.npos;
  • string.length() 返回string长度;
  • string.substr(int start, int length) start是子字符串开始的位置,length是子字符串的长度;
  • string.resize(int) resize可以初始化string的大小,可以让string使用scanf以及类似char[]的操作;

2. char大小写转换

头文件为:#include
变为大写:char = toupper(char)
变为小写:char = tolower(char)

3. vector

  • vector.size() 返回vector的大小
  • vector.push_back(Elem) 在vector的最后压入元素;
  • vector.pop_back() 删除vector中最后一个元素;
  • vector.assign(begin, end) 清空容器,进行赋值操作;

4. set

  • set.insert(Elem) 在set中插入元素;
  • set.size() 返回set的大小
  • set.find(Elem) 如果找到返回迭代器,如果没有找到,返回set.end()

遍历set的操作:

set::iterator iter = set.begin();
for(;iter!=set.end();iter++){
	//do something
	cout<<*iter<

5. map

  • map[Elem1] = Elem2 在map中以数组的方式插入数据;
  • map.find(Elem) 查找成功返回iterator,失败返回map.end();

map中每个元素的本质其实是pair;pair是可以使用pair.first和pair.second来表示第一个元素和第二个元素;
当使用迭代器时,(*iterator).first是map的key,(*iterator).second是map的value值;
而在排序的时候,是无法直接对map使用sort,我们可以考虑将map先转化为vector>来进行自定义排序;
其中,map和vector的转换代码为:

vector> temp(map.begin(),map.end());

6. 常用方法

6.1 头文件为:include
  • sort(a, a+length) a为第一个元素地址,length为需要排序的元素个数;
  • sort(vector.begin(), vector.end()) 这是vector排序;
  • sort(a, a+length, cmp) 其中cmp是自定一个的函数(bool cmp(a, b));
  • reverse(a, a+length) a为第一个元素地址,length为需要逆转的元素个数;
  • swap(a, b) 其中a,b可以是容器,可以是变量;
  • find(a, a+length, val) a为第一个元素的地址,length为查找范围,val是查找到值;
  • copy(a, a+length, b) a为输入元素地址,length为复制范围,b为输出元素首地址;
  • fill(a, a+length, val) a为初始化元素首地址,length为初始化范围,val为全部初始化的值;
6.2 头文件为:include
  • fabs(double) 取double的绝对值;
  • abs(int) 取int的绝对值;
  • round(double) 对double类型进行四舍五入;
  • sqrt(double) 返回double的算术平方根;
6.3 关于排序:

sort(a, a+length) 一般是将a按照ascii码的顺序排序;
sort(a, a+length, cmp) 是需要自定义排序时候,按照自定义的方法排序;
cmp函数的示例如下:

//按照从小到大排序;
//其中假定是将vector 排序,因此参数为string a和string b;
bool cmp(string a, string b){
	return a
6.4 初始化数组:
// fill(first, last, val);
int a[100];
fill(a,a+100,1);
6.5 最大值最小值:
int num[]={2,3,1,6,4,5};
cout<<"最小值是 "<<*min_element(num,num+6)<
6.6 绝对值:
abs(int);
fabs(double);
6.7 最大公约数:
int gcd(int a, int b){
    return b == 0 ? a : gcd(b, a % b);
}
6.8 最小公倍数:
int c = gcd(a, b);//最小公倍数可以利用最大公约数;
int lcm(int a, int b){
	return a*b/c;
}
6.9 set和vector之间的相互转换(可以用作为vector去重):
//set初始化vector
vector.assign(set.begin, set.end());
//vector初始化set
set(vector.begin(), vector.end());

7. 刷题技巧

  • 绝对值在10^9以内的整数要用int;超过2*10^9要用long(10^18以内);
  • 要注意“不超过”这样的字眼,意味着比较的时候应该用<=(或者>=);

8. 关于各个类型的转换

可以使用stringstream
eg:

#include 
stringstream ss;
string a="12";
int b;
ss<>b;

如果需要多次使用ss的话,可能还要用到ss.clear();

9. 输出输出以及格式问题

  • 如果是多循环的输入输出,一般使用scanf和printf,这样会提高很多效率,以防止时间限制;如果是输入输出单个固定,可以使用cin和cout;
  • 如果需要格式的输出,一定使用printf

printf的一般格式(一定要注意题目输出的int的形式):

  • printf("%6d", int); 输出为十进制最多6位的整数;
  • printf("%06d", int); 输出为十进制最多6位的整数,最高位补0;
  • printf("%6.4f", float); 输出6位,其中小数点后4位;

你可能感兴趣的:(研究生机试C++算法中常用函数)