以下内容是大一、大二竞赛的总结,主要是对STL的总结,一方面供个人备查,另一方面也作为分享。
目录
一、bitset总结
头文件:#include <bitset>
1.1 初始化
bitset<8> bitset1;
cout << bitset1 << endl; //输出:00000000
bitset<8> bitset2(177);
cout << bitset2 << endl; //输出:10110001
bitset<8> bitset3(string("11001010"));
cout << bitset3 << endl; //输出:11001010
1.2 改变位:reset()变为0,set()变为1
bitset<8> bitset1(string("11111111"));
bitset1.reset(2);
cout << bitset1 << endl; //输出:11111011
bitset<8> bitset2("00000000");
bitset2.set(5);
cout << bitset2 << endl; //输出:11011111
1.3 取反:flip( )
bitset<8> bitset1(string("11111111"));
bitset1.flip();
cout << bitset1 << endl; //输出:00000000
1.4 计数:count( )
bitset<8> bitset1(string("1111111"));
int n = bitset1.count();
cout << n << endl; //输出:7
1.5 判断:all( )是否所有位都为1,none是否所有位都为0
bitset<8> bitset1(string("11111111"));
bitset<8> bitset2(string("00000000"));
int x1 = bitset1.none();
int x2 = bitset2.none();
int y1 = bitset1.all();
int y2 = bitset2.all();
cout << x1 << ' '<< x2 << endl; //输出:0 1
cout << y1 << ' '<< y2 << endl; //输出:1 0
1.6 测试:test( n ) 测试第n位是1还是0
bitset<8> bitset1(string("01111011"));
int x = bitset1.test(0); //输出:1
int y = bitset1.test(2); //输出:0
cout << x << ' ' << y << endl; //输出:1 0
二、vector总结
头文件:#include <vector>
定义:vector<类型> 命名
插入元素: vec.push_back(x); //在vector末尾插入新元素x
删除元素: vec.pop_back(); //删除掉最后一个元素
清除所有元素:vec.clear(); //清除所有元素
遍历输出元素:for (int i = 0; i < vec.size(); i++) cout << vec[i] << ' ';
去重常用步骤:
vector<int> a;
//去重之前必须要先排序
sort(a.begin(),a.end());
//unique()函数将【相邻且重复】的元素放到vector的尾部,然后返回指向末尾部分第一个重复元素的迭代器
auto it = unique(a.begin(), a.end());
//erase()函数的两个参数分别代表,待删除部分指向开头和结尾的迭代器
erase(it,a.end());
vec.front():访问第一个元素值
vec.back():访问最后一个元素值
vec.size():获取数组的长度
vec.begin():访问第一个元素地址
vec.end():访问最后一个元素地址
二维动态数组:
下面代码的意思是创建一个名字为st的动态二维数组,一共有20行,10列,每个元素被初始化为false。
vector<vector<bool>> st(20, vector<bool>(10, false));
/* 翻转与排序:
#include <algorithm>
reverse(vec.begin(),vec.end()); 逆序排序
sort(vec.begin(),vec.end()); 从小到大排序
bool comp(const int& a, const int& b){ return a > b; }
sort(vec.begin(), vec.end(),comp); 从大到小排序
*/
三、string总结
判断字符串中是否含有某个元素:
string str="guanzhuwoshoucang" ; //字符串
string a="zhuwo" ; //查找字符串
if(str.find(a) != string::npos)
cout << "str字符串中含有a字符串" << endl;
判断某个元素在字符串中的位置(从右往左):
string str = "yudabcilovbciuman";
string s = "bci";
cout << str.rfind(s) << endl; //str.rfind()从字符串的右边开始查找,返回的是从右边开始第一次出现的下标
四、cstring总结
将字符串转化为浮点数:stof(字符串)
string str;
cin >> str;
printf("%.6lf",stof(str));
五、pair总结
5.1 pair对象的头文件:
#include <utility>
5.2 pair对象的创建与赋值:
pair<string,double> pair1;
pair<string,string> pair2("XMU","I Love xmu!");
pair<string,string> pair3(pair2);
pair<string,string> pair4(make_pair("xmu","I love programming"));
pair<string,string> pair5(string("XMU"),string("We love programming"));
5.3 pair对象的输出:
用 pair对象名.first 和 pair对象名.second 进行输出
cout << "pair1:" << pair1.first << " " << pair1.second << endl;
1. 从控制台读取数字:int number = Convert.ToInt32(Console.ReadLine());
2. 生成随机数:Random random = new Random(); random.Next(0, 8)
3. 拼接字符串:StringBuilder builder = new StringBuilder(); builder.Append(s[random.Next(0, len - 1)]);
一、下面是Python:
1.1 将多个变量赋值为整型:
row,col = map(int,input().split(" "))
1.2 创建二维数组:
下划线表示的是一个占位符,通常用于只关心循环次数的情况
res = [[0]*100 for _ in range(100)]
res = [[0]*6 for _ in range(5)] #表示5行6列的二维数组
1.3 ord()可以将字符转化为数值,chr()可以将数值转化为字符
1.4 交换两个元素的值
#假定2个元素分别为l和r,要交换二者的值
l,r = r,l
1.5 将整数格式化为二进制字符串
binary = format(1,'06b'); #将1转化为6位的二进制字符串,输出000001
二、Python基础语法:
1、单行注释:# ,多行注释:''' '''
2、python采用代码缩进和冒号来区别代码之间的层次
3、每个变量在使用前必须赋值,才会创建内存空间。python是基于值的内存管理,相同值指向同一空间。具有内存自动管理功能。不需要声明类型,解释器会根据赋值语句自动推断
4、进制:8进制数0o开头,16进制数0x或0X开头
5、字符串:可以用单引号(' ')、双引号(" ")和三引号(''' '''或""" """)进行界定。其中三引号内的字符串可以分布在多行上。
6、输入函数:input("提示信息")。如果想以空格作为输入的分隔符,可以这样写:a,b = input().split(' ')。
7、输出函数:print()。想不换行可print("",end='')。就是令end参数等于空。
下面是文件读写的例子:
fp=open('D:\motto.txt','a+')
print("自强不息,止于至善!",file=fp)
fp.close()
下面是格式化输出例子:
print('%o'%30) # 八进制,输出36
print('%d'%30) # 十进制,输出30
print('%x'%30) # 十六进制,输出1e
print('%o %d %x'%(24,29,28))
print('%f'%3.1873211) #浮点数输出保留小数点后6位
print('%s'%'我爱xmu') #字符串输出
name="小猫"
age=13
print(f'姓名:{name},年龄:{age}')
#输出:姓名:小猫,年龄:13
8、**是幂运算,//是取整除运算。
9、运算符优先级如下图:
三、程序控制结构:
1、赋值、选择语句简单案例:
a,b = 1,2
if a>b:
print(1)
elif a==b:
print(2)
else:
print(3)
2、while循环简单案例:
sum=0
n=0
while(n<100):
sum += n
n += 1
print(sum)
3、for循环简单语法及案例:
for 迭代变量 in 对象
语句块
sum=0
for n in range(1,100):
sum += n
print (sum)
4、range()函数:range(stop) 是从0到stop-1的整数值,range(start,stop)是从start到stop-1的值,range(start,stop,step)是从start到stop-step(注意:不包含stop)的值。
5、break同c语言类似。讲一下:continue:遇到continue是跳出本次循环,会跳过挡圈循环的剩余语句,继续进行下一轮循环。
6、pass。相当于就是一个空语句,起到占位符的作用。
四、序列:
1、列表:
3.1.1 列表的创建:
由方括号和逗号组成。将一组数据用方括号括起,用逗号分隔。里面可以含有各种不同的类型。
a = ['woai',123,"avd",'a']
for m in a:
print(m)
a = [0]*10 #创建含有10个全0元素的数组
len(列表)可以测量长度。
list()函数可以将range()对象、字符串、元组或其它可迭代的数据转换为列表。
num_list = list(range(1,6))
print(num_list)
创建多个相同元素的列表:
dp[0]*100 #相当于创建100个元素为0的列表
3.1.2 列表的删除:
del 列表名
动态增加列表元素有以下5种方法:
1. 列表名.append(元素)。2. 列表名.insert(插入位置,插入数据)。3. 列表名.extend(迭代对象) 可以将迭代对象追加到列表尾部。4. "+"运算符。5. "*"运算符,相当于乘上一个倍数,就是重复几次。
动态删除单个元素有以下3种方法:
1. del 列表名[待删元素下标]。2. 列表名.pop() 是默认删除列表最后一个元素。 3. 列表名.remove(待删元素)
获取指定元素出现次数:列表名.count(待统计元素)
获取指定元素首次出现的下标:列表名.index(元素)
统计数值列表元素和:用sum()函数进行统计。如:res = sum(数值列表名,累加起始位置)
3.1.3 列表的排序:
对列表进行排序2种方法:1. 列表名.sort() 默认按降序排序,如果在括号内加上reverse=True则按降序排序。 2. 使用内置sorted()函数进行排序。新列表名 = sorted(旧列表名)。会生成一个全新的列表,不会改变原本列表的顺序
3.1.4 列表的成员资格判断:
1. in 2. not in 3. count() 4. index()
name = ["saya","mata","mila","wage"]
res = "saya" not in name
print(res)
讲讲index:列表名.index(元素名)
3.1.5 列表的切片:
切片操作:
切片操作会生成一个新的列表,但不会改变原列表。采用:列表名[开始位:结束位:步长],当开始位为空时表示从0开始,当步长为-1时表示从末尾开始截取,这个时候需要注意开始位应该要大于结束位。
name = [3,4,22,32,9] name1 = name[4:1:-1] print(name1)
可以结合del命令与切片操作来批量删除数据,下面的示例相当于删除0~3位上的数据:
num = [13,54,38,93,28,74,59,92,85,66] del num[:4] print(num) # 输出[28,74,59,92,85,66]
3.1.6 列表的推导式:
可以在列表内部加上公式
list1=[3,5,7,11]
list2=[20,15,33,24]
num = [(x,y) for x in list1 for y in list2]
print(num)
# 输出:[(3, 20), (3, 15), (3, 33), (3, 24), (5, 20), (5, 15), (5, 33), (5, 24), (7, 20), (7, 15), (7, 33), (7, 24), (11, 20), (11, 15), (11, 33), (11, 24)]
3.1.7 二维列表:
a = []
for i in range(3):
a.append([])
for j in range(4):
a[i].append(j)
print(a)
# [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
3.1.8 常见问题:
在初始化 A
列表时,只创建了一个 a
列表,然后将其多次添加到 A
中。这样做会导致 A
中的所有子列表都指向同一个 a
列表,因此在后续的操作中修改 A
中的任意一个子列表时,其他子列表也会受到影响。
使用temp = A
进行赋值操作实际上是将temp
和A
指向同一个对象,而不是创建一个新的对象。这意味着当你修改temp
时,A
也会随之修改,因为它们引用的是同一个列表。
通过使用temp = [row[:] for row in A]
,我们可以创建A
的一个副本temp
,其中每一行都是A
对应行的副本。
temp = [row[:] for row in A]
2、元组:
3.2.1、创建元组:
元组使用的是圆括号()。元组中的元素不允许修改,但可以进行重新赋值。删除元组:del 元组名。元素常用内置函数:len(元组名)求长度。max(元组名)返回元组中元素最大值,min返回最小值。tuple(seq)将序列转为元组。
3.2.2、元组和列表的差别和转换:
3、字典:
3.3.1、字典的概念:
用于存放具有映射关系的数据,一组数据是关键数据被称为“键”(key),另一组数据可通过键来访问,被称为“值”(value)。字典是用{ }括起来的。
grade = {"语文":97,"英语":100,"数学":89}
print(grade["语文"]) # 访问方法1:输出97
print(grade.get("语文")) # 访问方法2:使用get()方法,输出97
print(grade.items()) # 获得键值对列表
print(grade.keys()) # 获得键列表
print(grade.values()) # 获得值列表
for item in grade.items(): # 逐个输出键值对元素
print(item)
for key in grade.keys(): # 逐个输出键元素
print(key)
for value in grade.values(): # 逐个输出值元素
print(value)
3.3.2 删除字典:
del 字典名
grade = {"语文":97,"英语":100,"数学":89}
grade["计算机"]=91 # 添加元素
grade["语文"]=60 # 修改已有元素值
grade.update({"政治":68,"历史":72}) # 如果被更新的字典中不包含对应的键值对,则该键值对被添加进去
print (grade)
3.3.3 增加字典元素:
count = {} #创建字典
count['a'] = 1 #元素a对应的值为1
4、集合:
3.4.1集合的概念:
是无序不重复的元素序列,元素不可改变,使用大括号{ }创建,如果存在重复元素则只保留一个。添加的元素不能是列表、元组等可迭代对象。可以用pop(),remove()删除单个元素,用clear()方法删除所有元素。
五、字符串:
用一对单引号或双引号包裹字面量构成字符串。
4.1 isinstance()函数
字符串切片如下:
str = "WoAiNi"
str1 = str[2:5] #截取字符串2~4生成新字符串
print(str1)
4.2 读入矩阵
例如读入一个12x12的矩阵,数字间用空格隔开,代码如下:
for i in range(12):
str = input().split(' ')
a = []
for i in str:
a.append(float(i))
total.append(a)
4.3 对字符串排序
先转化为列表然后利用列表排序
alpha = input()
res = list(alpha)
res.sort()
print(res)
4.4 一些技巧
[0 for i in range(5)]表示输出以5个重复0为元素的列表
str(i) for i in ans 是从列表中取出元素转化为字符。
''.join()表示的是以空字符作为连接符,将括号里的字符进行连接
ans = [0 for i in range(5)]
print(ans) #输出:[0, 0, 0, 0, 0]
print(''.join(str(i) for i in ans)) #输出:00000
六、函数:
1、函数的定义:
def 函数名(参数列表):
函数体
2、匿名函数的定义:
匿名函数名 = lambda 参数列表:表达式
3、参数传递:
传递给不可变对象:是生成了一个新的对象,函数并不会影响对象本身。
传递给可变对象:函数可以修改对象本身。