c++读写文件与容器操作


读写文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
srand(time(0));
freopen("1.in","r",stdin);
int a[5];
for(int i=0;i<5;i++){
scanf("%d",&a[i]);
}
freopen("1.out","w",stdout);
for(int i=0;i<5;i++){
printf("%d\n",a[i]);
}
return 0;
}

algorithm头文件

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a=2,b=4;
cout<<max(2,3)<<endl;
cout<<min(2,3)<<endl;
cout<<a<<b<<endl;
swap(a,b);
cout<<a<<b<<endl;
return 0;
}

引用

1
2
3
4
5
6
7
8
9
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a=10;
int &b=a;
cout<<b;
return 0;
}

引用的使用(交换变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#include<iostream>
#include<algorithm>
using namespace std;

void my_swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}

int main(){
int a=10;
int b=12;
cout<<a<<b<<endl;
my_swap(a,b);
cout<<a<<b<<endl;
return 0;
}

异或运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
using namespace std;

int main(){
//异或就是先取反后或运算
int one=1;
int zero=0;
int res1=one^one;
int res2=one^zero;
int res3=zero^one;
int res4=zero^zero;
cout<<res1<<" "<<res2<<" "<<res3<<" "<<res4;
return 0;
}

c++中的string基本运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

int main(){
string s="asdsad";
s.insert(1,"super boy");
cout<<s<<endl;
s.erase(1,9);
cout<<s<<endl;
string s2=s.substr(1,10);
cout<<s2.size()<<endl;
//找到返回索引,找不到返回-1
int pos=s.find("sadasd");
cout<<pos<<endl;
string s3="11231231";
cout<<s3.find('1',3);//输出4
cout<<s3.find('1',6);//输出7
return 0;
}

c++容器

vector

动态更新数组内存,底层实现是数组,可以按索引顺序访问,如果是插入和删除则需要内存区的拷贝

int初始化方式

代码 解释
vector a; 初始化一个名为a装有int值的vector容器
vector b(a); 用a定义b(地址不一样,完全是两个vector)
vector a(100); 定义一个a,有100个数字0
vector a(100,12); 定义一个a,有100个数字6

string初始化方式

vector s; 初始化一个名为s装有string值的vector容器
vector s(s.begin(),s.end()); 用s1定义s(地址不一样,完全是两个vector)
vector s(s1); 同上
vector s(100,”null”); 初始化100个null

妙用

struct point{int x,y;} vector p; p用来存放坐标
vector a[MAXN] 定义多维数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
using namespace std;
struct point{
int x,y;
};

int main(){
vector<int> a;
vector<int> b(a);
cout<<&a<<" "<<&b<<endl;
vector<string> s1;
vector<string> s(s1);
vector<string> s2(s1.begin(),s1.end());
cout<<&s<<" "<<&s1<<" "<<&s2<<endl;
vector<point> p();
cout<<"vector的各种操作"<<endl;
return 0;
}

练习

初始化数值方式1:先定义空间大小,后循环访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std;

int main(){
vector<int> a(100);
cout<<"vector的各种操作"<<endl;

for(int i=0;i<10;i++){
a[i]=i;
cout<<a[i]<<endl;
}

return 0;
}

初始化数值方式2:直接初始化,不定义空间,然后push_back();

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;

int main(){
vector<int> a;
for(int i=0;i<10;i++){
a.push_back(i);
cout<<a[i]<<endl;
}
return 0;
}

汇总:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<bits/stdc++.h>
using namespace std;
void print(vector<int>& a){
if(!a.empty()){
for(int i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
cout<<endl;
}else{
cout<<"您的vector为空!!\n";
}
}

int main(){
vector<int> a;
cout<<a.empty()<<endl;
for(int i=0;i<10;i++){
a.push_back(i);
}
print(a);
a.insert(a.begin(),123);
print(a);
a.insert(a.end(),123);
print(a);
a.resize(10);
print(a);
a.insert(a.end(),10,0);
print(a);
a.insert(a.begin()+3,521);
print(a);

a.erase(a.begin());
print(a);
int i=0,j=1;
a.erase(a.begin()+i,a.begin()+j);
print(a);
reverse(a.begin(),a.end());
print(a);
sort(a.begin(),a.end());
print(a);
/*
用迭代器的,一般是区间,如vector的erase
用数字的,一般是开头的个数,如string的substr
预备知识
a.begin()指向第一个元素,a.end()指向末尾,不是最后一个元素
1.判断是否为空a.empty();
2.插入元素a.insert(a.begin(),3);
a.insert(a.end(),10);
a.insert(a.begin()+i,12);//在索引为i的位置插入
a.insert(a.begin(),10,0);//在a的末尾插入10个0
3.删除元素 a.erase(a.begin());//删除开头元素
a.erase(a.begin(),a.end());//删除所有元素
a.erase(a.begin(),a.begin()+a.size());//删除所有元素
pop_back()
4.清空clear()
5.翻转reverse(a.begin(),a.end());
*/
return 0;
}

list

STL中的list是双向链表,在内存中地址不连续,通过指针来实现数据的访问,插入和删除的的时间复杂度是常数级

map

底层是平衡二叉搜索树,效率高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <map>
#include <string.h>
using namespace std;

void translate(map<int,int> temp_map);//map直接作为参数传递
void translate(map<int,int> *pMap);//传递map指针
int main()
{
map<int,int> map1;
map1.insert(map<int,int>::value_type(1,22));

translate(map1);

map<int,int> *pmap1;
pmap1 = &map1;

translate(pmap1);

map<int,int> map2;
map2 = map1;//直接赋值
map<int,int>::iterator iter;
iter = map2.begin();
cout<<iter->second<<endl;
return 0;
}

void translate(map<int,int> temp_map)
{
map<int,int> map2;
map2 = temp_map;
map<int,int>::iterator iter;
iter = map2.begin();
cout<<iter->second<<endl;
}
void translate(map<int,int> *pMap)
{
map<int,int> map2;
map2 = *pMap;
map<int,int>::iterator iter;
iter = map2.begin();
cout<<iter->second<<endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<bits/stdc++.h>
using namespace std;
void print(map<int,string> m){
map<int,string>::iterator it;
for(it=m.begin();it!=m.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}
}
int main()
{
pair<int,string> p;
p.first=1;
p.second="123";
map<int,string> m;
m.insert(p);
cout<<p.first<<" "<<p.second<<endl;
map<int,string>::iterator it;

m[3]="234";
for(it=m.begin();it!=m.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}
m.insert(make_pair(6,"你好"));
cout<<m[0]<<endl;
pair<int,string> p2;
p2.first=12;
p2.second="123123";
m.empty();
print(m);
m.clear();
print(m);
m.empty();
/*
m[i]可用于输出元素,还可用于创建元素
1.初始化 map<type,type> name;
2.添加元素 m[key]=value;
pair<type,type> p;m.insert(p);//insert返回该元素的迭代器
3.输出元素 cout<<m[i] ;
4.清空元素clear();
5.判断是否为空empty();
*/
return 0;
}

set

底层实现是二叉搜索树,在竞赛中很常见访问每个元素的时间复杂度是O(logn)

代码 解释
set s; 初始化一个set的集合
s.insert(item); 将item插入s中
s.erase(); 将item删除,成功则1反之0
s.find(k); 查找k返回一个迭代器
s.count(k); 查找k存在返回1,不存在则0
s.clear(); 清除s中的数据
s.empty(); 判断s是否为空
s.lower_bound(k); 返回不小于k的迭代器
s.upper_bound(k); 返回不大于k的迭代器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using namespace std;

void p(set<int>& s){
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
vector<int> v;
set<int> s;
for(int i=0;i<10;i++){
s.insert(i);
}
set<int>::iterator it;
p(s);
s.count(10);
p(s);
s.erase(1);
p(s);
it=s.begin();
it++;
it++;
s.erase(it,s.end());
p(s);
return 0;
}

dequeue

queue

队列,先进先出,后进后出

代码 解释
queue q; 初始化一个q的队列
q.front(); 返回队首元素
q.back(); 返回队尾元素
q.pop(); 队首元素出队
q.push(num); 把num放入队尾部
q.size(); 返回队列的大小
q.empty(); 判断队列是否为空

priority_queue优先队列

底层实现是二叉堆,队里有自己的排序方式,每次入队都会将优先级最高的放在队首

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std;

int main(){
priority_queue<int> q;
for(int i=0;i<10;i++){
q.push(i);
}
while(!q.empty()){
cout<<q.front()<<endl;
q.pop();
}
return 0;
}

上述结果是9,8,7—-0,说明每次push,优先队列都会把最大的数字放到前面

less会让队列从队首到队尾是高到低排列,也就是数字大的优先级越高(默认)

greater会让队列从队首到队尾是低到高排列,也就是数字小的优先级越高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]={10,12,14,6,8};
int main()
{
for(int i=0;i<5;i++)
p.push(a[i]),q.push(a[i]);

printf("less<int>:");
while(!p.empty())
printf("%d ",p.top()),p.pop();

printf("\ngreater<int>:");
while(!q.empty())
printf("%d ",q.top()),q.pop();
}

stack

先进后出的数据结构

代码 解释
stack sta; 初始化一个sta的栈
sta.push(num); 把数字num放入sta中
sta.pop(); 队首元素出栈
sta.top(); 查看队首元素
sta.size(); 返回栈的长度
sta.empty(); 判断栈是否为空

迭代器iterator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v;
set<int> s;
for(int i=0;i<10;i++){
s.insert(i);
}
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it;
}
return 0;
}

pair

参考链接:pair的使用

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;

int main()
{
pair<int,string> p;
p.first=1;
p.second="123";
cout<<p.first<<" "<<p.second;
return 0;
}

Author: pkq
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source pkq !
  TOC