C++学习小记

1、scanf读入字符时不会忽略空格和回车,但cin默认会忽略空格和回车。
2、std::ios::sync_with_stdio(false);
原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。
3、inline可以放在声明处,也可以放在定义处,也可以两个地方都放。但是inline是属于实现部分的内容,不应该出现在接口处,即类的使用者从使用的角度不需要知道是不是inline的。所以,编程规范是inline关键字应该只出现在定义处,而不应该在声明处,所以class body里不应该出现“inline”。
4、注意程序健壮性:可能例子都是后数大于前数,但是可能用例有前数大于后数。
5、while(scanf("%d%d", &l, &r) != EOF)用于循环输入时随时判断结束。
6、打印对称图形或者有规律的矩阵可以考虑建立二维坐标,找出满足的函数。如下图

7、
#include
using namespace std;

int main()
{
int n;
cin >> n;
string s = “”;//先赋值一个空串防止内存访问冲突
for (int i = 0; i < n ; i ++)
{
string t = s;
s += i + ‘A’;//还可以写成 s = s + (char)(i + ‘A’);但是不能写成 s = s + i + ‘A’;另外字符串加字符还是得到字符串,char + int 会得到 int
s += t;
}
cout << s;
return 0;
}

8、%星号s的用法:
①在scanf中使用,则添加了*的部分会被忽略,不会被参数获取。

例如:int a,b;char b[10];scanf("%d%*s",&a,b);输入为:12 abc那么12将会读取到变量a中,但是后面的abc将在读取之后抛弃,不赋予任何变量(例如这里的字符数组b)

②在printf中使用,表示用后面的形参替代的位置,实现动态格式输出。

例如:

printf("%*s",10,s);/意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,这里等同于printf("%10s",s);

9、输入矩阵时,如果同行没有空格
比如:
111
222
333
可以定义:char g[N][N];
在输入时可以直接一行一行输入:
for(int i = 0; i < 3; i++)cin >> g[i];

10、裴蜀定理(或贝祖定理):
说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
如果两个数互质,最大凑不出整数是 (p - 1) * (q - 1) - 1

11、遇到特定规律的题可以打表找规律。

12、读取某个文件中的数据时可以用(头文件为#include)

ifstream fin("data.txt");
	for(i=1;i<=29;i++)
		for(j=1;j<=i;j++)
			fin >> a[i][j];//一个给读取,会避开其他符号,比如空格

文件要在同一个文件夹中保存为记事本(data),不加.txt

	ifstream fin;
	fin.open("data.txt", ios::in);
	for(i=1;i<=29;i++)
		for(j=1;j<=i;j++)
			fin >> a[i][j];

文件要在同一个文件夹中保存为记事本(data),不加 .txt
要是出问题,建议关掉源代码,在文件夹中重新打开一次

13、setprecision(要保留的有效位数);
包含在头文件#include中,使用 setprecision 操作符来控制显示浮点数值的有效数的数量。

14、循环输入直到输入两个0为止
while(cin >> x >>y, x || y);

15、memset(a, 0, sizeof(a));初始化

16、日期问题

#include <iostream>

using namespace std;

int mon[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct Date{
	int y, m, d;
}now;

bool rn(int y)
{
	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) return true;
	else return false;
}

int main()
{
	int n;
	cin >> n;
	now.y = 1777, now.m = 4, now.d = 30;
	
	n--;
	
	while(n--)
	{
		now.d ++;
		if (now.m == 2 && now.d == 28)
		{
			if (rn(now.y)) mon[2] = 29;
			else mon[2] = 28;
		}
		
		if (now.d > mon[now.m])
		{
			now.m ++;
			if (now.m > 12)
			{
				now.y ++;
				now.m = 1;
			}
			now.d = 1;
		}
	}
	cout << now.y << now.m << now.d;
	return 0;
}

17、字符串

s.substr(2, 3); 从2开始截取3个
s.find(‘2’); 返回‘2’的位置
s.swap(s2); 交换s和s2
s.replace(2,3, s2, 1, 2); 将s的2到3替换为s2的1到2
s.replace(2, 3, 5, ‘0’); 将s的2到3替换为“00000”
s.replace(2, 3, s2); 将s的2到3替换为s2

在字符串str后面添加字符的时候,写成 str = str + “hbkjbj”;最好不要写成str += “jkbjkbjkbk”; 不能再自己前面加,只能在后面加,要是要在前面加可以先定义一个 str0 = “sc”, str0 = str0 + str, str = str0;

字符串比较大小:
string str1 = “asdf”;
string str2 = “qwer”;
strcmp(str1.c_str(), str2.c_str());要用c_str()

string s;
cin>>s;
int len=s.length();
map<string,int> mp; // 存放截取出来的字符串
int num=0; // 累加不同子串的数量
for(int i=0; i<len; i++)
{
    for(int j=1; j<=len; j++)
    {
        string ss=s.substr(i,j); //从下标i开始截取长度为j的字符串
        if(mp[ss]==0)
        {
            num++;
            mp[ss]++;
        }
    }
}
cout<<num<<endl;

数字转字符串
void test2()
{
string s = “123”;
int a = 52;
double b = 0.1314;
ostringstream oss;
oss << s << a << b;
cout << oss.str() << endl; //123520.1314
}

18、
warning:deprecated conversion from string constant to 'char *'解决方案
char *背后的含义是:给我个字符串,我要修改它。

而理论上,我们传给函数的字面常量是没法被修改的。

所以说,比较和理的办法是把参数类型修改为const char *。

19、STL
set:
(1)set会自动从小到大排序并去重
(2)set.find()函数:
find会挨个查找set,当set.find(x) == set.end(),就是没找到x。x为所查找的值,找到该数了,则返回该数的位置,所以可以用*(set.find(x))输出得到查找的该数。
(3)输出set A 中的数
for(set::iterator p = A.begin(); p != A.end(); p ++)cout << *p << " ";

begin()    ,返回set容器的第一个元素

end()      ,返回set容器的最后一个元素

clear()    ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

map: map<key, value>
map会按照第一个关键字从小到大排序
map.clear();清除之前的数据,相当于初始化为空
map.find(s1)->second 在map中找到s1所在的map的第二位
map.find(s1)->first找第二位,只能根据key找,不能根据value找

queue:
queue 和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同:
front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop():删除 queue 中的第一个元素。
size():返回 queue 中元素的个数。
empty():如果 queue 中没有元素的话,返回 true。
emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
swap(queue &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap(q1, q2) 来完成同样的操作。

和 stack 一样,queue 也没有迭代器。访问元素的唯一方式是遍历容器内容,并移除访问过的每一个元素。

priority_queue:
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容

//升序队列
priority_queue <int,vector,greater > q;
//降序队列 priority_queue q;默认是降序
priority_queue <int,vector,less >q;

20、C++ 万能头文件 #include<bits/stdc++.h>

21、reverse函数(头文件 algorithm)
将容器、数组、字符串顺序颠倒

\容器
reverse(A.begin(), A.end());
\数组
reverse(a, a+n);
\字符串
reverse(s.begin(), s.end());

22、错误票据

#include<iostream>

using namespace std;

const int N = 100010;

int num[N];

int main()
{
	int m, n;
	int line;
	int x;
	int min_ = 200000;
	int max_ = 0;
	cin >> line;
	while(line --)
	{
		while(cin >> x)//只要是符合x的数据类型就会持续执行,如果不是则直到下一次是,只有当有判断条件使程序停止才会停
		{
			num[x] ++;
			if (cin.get() == '\n') break;
			max_ = max(max_, x);
			min_ = min(min_, x);
		}
	}
	
	for (int i = min_; i <= max_; i ++ )
	{
		if (num[i] == 0) m = i;
		if (num[i] > 1) n = i;
	}
	
	cout << m << ' ' << n;

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值