C++竞赛快速复习知识整合(包的常见函数与小知识)

C++常用包

#include <iostream>//该头文件的作用是包含了操作bai输入输出流的方du法
#include <math.h>
#include <iomanip>
#include <string>
#include <vector>
#include<stdio.h>
#include <algorithm>
using namespace std;

math.h

  • abs( int num );函数返回num的绝对值
  • double cos(double x);返回弧度角 x 的余弦。
  • double sin(double x);返回弧度角 x 的正弦。
  • double log10(double x);返回 x 的常用对数基数为 10 的对数
  • double log(double x)返回 x 的自然对数基数为 e 的对数。
  • double pow(double x, double y);返回 x 的 y 次幂。
  • double sqrt(double x);返回 x 的平方根。
  • double floor(double x);返回小于或等于 x 的最大的整数值。
  • double fmod(double x, double y);返回 x 除以 y 的余数。

string

  • size()和length():返回string对象的字符个数,他们执行效果相同。
  • 成员函数compare()支持多参数处理,支持用索引值和长度定位子串进行比较,前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
string A("aBcdf");
string B("AbcdF");
string C("123456");
string D("123dfg");

cout << "A.compare(B):" << A.compare(B) << endl;                          //"aBcdf"和"AbcdF"比较,a>A,返回1
cout << "A.compare(2, 2, B):" << A.compare(2, 2, B)<< endl;               //"cd"和“AbcdF"比较,c>A,返回1
cout << "A.compare(2, 2, B, 2, 2):" << A.compare(2, 2, B, 2, 2) << endl;  //"cd"和“cd"比较,返回0
cout << "C.compare(0, 4, D, 0, 4):" << C.compare(0, 4, D, 0, 4)<< endl;   //"1234"和"123d"比较,返回-1
  • string的插入:push_back() 和 insert()
s1.push_back('c');// 尾插一个字符
    cout<<"s1:"<<s1<<endl; // s1:abc
    // insert(pos,char):在制定的位置pos前插入字符char
    s1.insert(s1.begin(),'1');
  • string拼接字符串:append() 、 +
//方法一:append()
string s1("abc");
s1.append("def");
cout<<"s1:"<<s1<<endl; // s1:abcdef
// 方法二:+ 操作符
string s2 = "abc";
/*s2 += "def";*/
string s3 = "def";
s2 += s3.c_str();
cout<<"s2:"<<s2<<endl; // s2:abcdef
  • string的删除:erase()
  1. iterator erase(iterator p):删除字符串中p所指的字符
  2. iterator erase(iterator first, iterator last):删除字符串中迭代器区间 [first, last) 上所有字符
  3. string& erase(size_t pos, size_t len):删除字符串中从索引位置 pos 开始的 len 个字符
  4. void clear():删除字符串中所有字
  • string的字符替换
  1. string& replace(size_t pos, size_t n, const char *s):将当前字符串从pos索引开始的n个字符,替换成字符串s
  2. string& replace(size_t pos, size_t n, size_t n1, char c):将当前字符串从pos索引开始的n个字符,替换成n1个字符c
  3. string& replace(iterator i1, iterator i2, const char* s):将当前字符串[i1,i2)区间中的字符串替换为字符串s
string s1("hello,world!");
s1.replace(6, 5, "girl");                       // 结果:hello,girl.
s1.replace(s1.size() - 1, 1, 1, '.');           // 结果:hello,world.
s1.replace(s1.begin(), s1.begin() + 5, "boy");  // 结果:boy,girl.
  • string大小写转换:tolower() 和 toupper()
  • string的查找:find
  1. find (const char* s, size_t pos):在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引
  2. find (char c, size_t pos):在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引
  3. rfind (const char* s, size_t pos):在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引
  4. rfind (char c, size_t pos):在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引
  5. find_first_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,查找子串s的字符,返回找到的位置索引
  6. find_first_not_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引
  7. find_last_of(const char* s, size_t pos):在当前字符串的pos索引位置开始,向前查找第一个位于子串s的字符,返回找到的位置索引
  8. find_last_not_of (const char* s, size_t pos):在当前字符串的pos索引位置开始,向前查找第一个不位于子串s的字符,返回找到的位置索引
string s("dog bird chicken bird cat");

//字符串查找-----找到后返回首字母在字符串中的下标
// 1. 查找一个字符串
cout << s.find("chicken") << endl;        // 结果是:9

// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i', 6) << endl;            // 结果是:11

// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
cout << s.rfind("chicken") << endl;       // 结果是:9

// 4. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl;             // 结果是:18

// 5. 在该字符串中查找第一个属于字符串s的字符
cout << s.find_first_of("13br98") << endl;  // 结果是:4("b")

// 6. 在该字符串中查找第一个不属于字符串s的字符,先匹配dog,然后bird匹配不到,所以打印4
cout << s.find_first_not_of("hello dog 2006") << endl; // 结果是:4

// 7. 在该字符串从后往前查找第一个属于字符串s的字符
cout << s.find_last_of("13r98") << endl;               // 结果是:19

// 8. 在该字符串从后往前查找第一个不属于字符串s的字符,先匹配tac,然后空格匹配不到,所以打印21
cout << s.find_last_not_of("teac") << endl;            // 结果是:21
  • string的分割/截取字符串:substr()
string s1("0123456789");
string s2 = s1.substr(2, 5); 
cout << s2 << endl;    // 结果:23456,参数5表示截取的字符串的长度

iomanip

例:保留两位有效数字

  1. 用C语言的方法:输入printf("%5.2f",a),其中5表示宽度,2就是精度,即保留两位小数。(%9.2f 表示输出场宽bai为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。)

  2. 设置小数位版数法:cout<<setiosflags(ios::fixed)<<setprecision(2);
    当setiosflags(ios::fixed)和serprecision(n)两个一起用权时就表示保留n位小数输出。这里还要注意,每次输出只要设置一次就行了,因为这两个的作用范围是后续对象,而不是仅对后一个对象起作用。
    setprecision是指设置输出精度,当没cout<<setiosflags(ios::fixed)时,输出格式是数据的有效位数。

algorithm

  • 排序 sort()
sort(a.begin(),a.end)
sort(a.begin(),a.end,myfun)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct
{
	int val;
}node;
bool great(node a, node b)
{
	return a.val < b.val;
}
bool les(node a, node b)
{
	return a.val > b.val;
}
void print(vector<node> a)
{
	for (node t:a)
	{
		cout << t.val << ' ';
	}
	cout << endl;
}
int main()
{
	vector<node> vec(4);
	vec[0].val = 3;
	vec[1].val = 2;
	vec[2].val = 1;
	vec[3].val = 5;
	cout << "初始数据" << endl;
	print(vec);

	sort(vec.begin(),vec.end(),great);
	cout << "升序排列" << endl;
	print(vec);

	sort(vec.begin(), vec.end(),les);
	cout << "降序排列" << endl;
	print(vec);

	system("pause");
	return 0;
}
bool compare(int a, int b)
{
	return a > b; //升序排列,如果改为return a>b,则为降序
}
  • reverse(it,it2) 可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转。
resvese(a.begin(),a.end());
  • unique()去重
unique(a.begin(),a.end());

unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。
  一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做),由于本例中的元素已经是排好序的,所以此处我没排序,但实际使用中不要忘记。
  unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)

a.erase(unique(a.begin(),a.end()),a.end());

小知识点

结构体数组

struct student
{
	string name;
	int age;
	float score;
}a[100];

C++求数组长度

#include<iostream>
using namespace std;
template<class T>

int length(T& arr)
{
    //cout << sizeof(arr[0]) << endl;
    //cout << sizeof(arr) << endl;
    return sizeof(arr) / sizeof(arr[0]);
}

int main()
{
    int arr[] = { 1,5,9,10,9,2 };
    // 方法一
    cout << "数组的长度为:" << length(arr) << endl;
    // 方法二
    //cout << end(arr) << endl;
    //cout << begin(arr) << endl;
    cout << "数组的长度为:" << end(arr)-begin(arr) << endl;
    system("pause");
    return 0;
}

C 语言scanf的使用

  • %a、%A 读入一个浮点值(仅 C99 有效)。 float *
  • %c 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 char *
  • %d 十进制整数:数字前面的 + 或 - 号是可选的。 int *
  • %e、%E、%f、%F、%g、%G 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 float *
  • %i 读入十进制,八进制,十六进制整数 。 int *
  • %o 八进制整数。 int *
  • %s 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 char *
  • %u 无符号的十进制整数。 unsigned int *
  • %x、%X 十六进制整数。 int *
#include<stdio.h>
int main(void) 
{ 
    int a,b,c; 
 
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c); 
    printf("%d,%d,%d\n",a,b,c);
    return 0; 
}

解析说明:

  1. &a、&b、&c 中的 & 是地址运算符,分别获得这三个变量的内存地址。
  2. %d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
    如果使用 , 来分隔输入的 %d, 相应的输入时也需要添加 ,:
#include<stdio.h>
int main(void)
{
    int a,b,c;
 
    printf("请输入三个数字:");
    scanf("%d, %d, %d",&a,&b,&c);
    printf("%d, %d, %d\n",a,b,c);
    return 0;
}

注意:输入时 , 前一定要紧跟在数字后面,数字与 , 之间不能有空格。

在用 %c 输入时,空格和"转义字符"均作为有效字符。

#include<stdio.h>
int main(void)
{
    char a,b,c;
 
    printf("请输入三个字符:");
    scanf("%c%c%c",&a,&b,&c); 
    printf("%c,%c,%c\n", a,b,c);
    return 0;
}
#include <stdio.h>
 
int main()
{
   char str1[20], str2[30];
 
   printf("请输入用户名:");
   scanf("%s", str1);
 
   printf("请输入您的网站:");
   scanf("%s", str2);
 
   printf("输入的用户名:%s\n", str1);
   printf("输入的网站:%s", str2);
   
   return(0);
}

C 语言printf的使用

  • %d 十进制有符号整数
  • %u 十进制无符号整数
  • %f 浮点数
  • %s 字符串
  • %c 单个字符
  • %p 指针的值
  • %e 指数形式的浮点数
  • %x, %X 无符号以十六进制表示的整数
  • %o 无符号以八进制表示的整数
  • %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
  • %p 输出地址符
  • %lu 32位无符号整数
  • %llu 64位无符号整数
#include <stdio.h>
 
int main ()
{
   int ch;
 
   for( ch = 75 ; ch <= 100; ch++ ) {
      printf("ASCII 值 = %d, 字符 = %c\n", ch , ch );
   }
 
   return(0);
}
#include <stdio.h>
int main()
{
   char ch = 'A';
   char str[20] = "www.runoob.com";
   float flt = 10.234;
   int no = 150;
   double dbl = 20.123456;
   printf("字符为 %c \n", ch);
   printf("字符串为 %s \n" , str);
   printf("浮点数为 %f \n", flt);
   printf("整数为 %d\n" , no);
   printf("双精度值为 %lf \n", dbl);
   printf("八进制值为 %o \n", no);
   printf("十六进制值为 %x \n", no);
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值