c++程序设计-c语言转向c++

此博客只是为了快捷转变语言,从上手角度描写,没有描述细节内容。

简单的文件处理

stream文件读入
ifstream fin(“输入流文件名”);
ofstream fout(“输出流文件名”);
fin>>变量名; / fout<<变量名;
fin.close(); / fout.close();
file文件读入
freopen(“输入流文件名”,“r (只读)”,stdin);
freopen(“输出流文件名”,“w (只写)”,stdout);
样例

#include<stdio.h>
int main()
{
	int i, n, s;
	freopen("a.txt", "r", stdin);//"r"只读 ,stdin以标准方式读入
	freopen("b.tet", "w", stdout);//"w"只输出,stdout以标准方式输出 
	while (~scanf("%d", &n))
	{
		s = 0;
		for (i = 1; i <= n; i++)
			s = s + i;
		printf("%d\n", s);
	}
	return 0;
}

c++的头文件

#include<stdio.h> -->> #include<cstdio>//其他同理
#include<bits/stdc++.h>//万能头文件,并不是所有的oj都支持
using namespace std; //使用标准命名空间

[具体说明] :
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中当使用<iostream.h>,相当于在C中调用库函数,使用的是圣局命名空间,也就是早期的C+ +实现;当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout、cin和endl。

输入输出

printf / scanf-- >> cin / cout
ios::sync_ with_ stdio(false);

很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,在C++中,cin和cout要与stdio同步,中间会有一个缓冲,所以导致cin,cout语句输入输出缓慢,这时就可以用这个语句,取消cin,cout与stdio的同步,说白了就是提速,效率基本与scanf和printf一致。然后就可放心的使用cin,cout了。

例1 已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少?

#include<iostream>
using namespace std;
int main()
{
	ios::sync_ with_ stdio(false);
	int x, y;
	cout << "Input x=";//输出注意箭头方向
	cin >> x;//箭头是输入输出流 
	y = 10 * x;
	cout << "total=" << y << endl;//endl相当于回车 
	return 0;
}

其他注意

Dev C++版本注意事项
在5.0版本DevC++中, 不是万能库
1.在c++中需要调用:getchar(), stdin, stdout, freopen(), fclose(), scanf(), printf()
2.在c++中需要调用:memset()
3.在c++中 需要调用:qsort(), exit()
4. < algorithm > 中的STL

c++中的常用操作

sort(默认以非降序排序)

sort(begin, end, cmp)
其中begin为指向待sort()的数组的第一个元素的指针,
end为指向待sort()的数组的最后一个元素的下一个位置的指针,
cmp参数为排序准则,如果没有的话,默认以非降序排序。

string

string相比char a[]类型更加简便,可以进行s1=s2;操作

类型的定义与初始化

#include<string>
using namespace std;
......
string s1;            //定义一个字符串s1,并初始化为空
string s2(s1);        //用s1初始化s2
string s3("value");   //将s3初始化为"value"
string s4(n, 'c');     //将s4初始化为字符'c'的n个副本

string对象的读写

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int T;
    cin >> T;
    getchar();
    /*如果没有这个getchar()那么s首先会把我们按空格给s,要注意:
     cin是不会这样,同样的是gets()也会和getline()出现一样的情况*/
    while (T--)
    {
        string s;
        getline(cin, s);/*getline读入一行,cin是读入流,
                        s是字符串,存放读入的东西*/
        cout << s << endl;
    }
    return 0;
}

string类型的操作

操作说明
s. empty ()如果s为空串,则返回true,否则返回false
s. size()返回s中字符的个数,s.length()用 法与s.size()相同
s[n]返回s中位置为o的字符,位置从0开始计数(可将值赋给s[u])
s1+s2把s1和s2连接成个新字符由,返回新生成的字符串
s1=s2把s 1内容替换为s2的副本
s1==s2比较s1与s2的内容,相等则返回true,否则返回false
!=, <, <=, >和>=保持这些操作符惯有的含义
注意点“+”操作:
string s1("hello ");//等价于strings1="hello”;
string s2("world\n");
s1 += s2;//等价于s1=s1+s2,此时s1="hello world\n'
字符串"+"操作符的左右操作数必须有一个为字符串类型。
strings1 = "hello";
string s2 = "world";
strings3 = s1 + ",";//合法
string s4 = "hello " + "world"; //非法
string s5 = s1 + "," + "world";//合法,根据从左至右的结合法则
//s1+","变成一个字符串类型,然后再与”world"相连。
string s6 = "hello" + "," + s2; //非法, 因为"hello"与","都是字符数组类型

字符串的下标操作:

string str="2+2=4";
cout<<str[1]<<end;//将输出’+’
str[1]='*';//现在str[1]变成了'*'

其它一些常用操作:

操作说明
s. insert (pos, s2)在s下标为pos的元素前插入string类型s2
s. substr (pos, len)返回一个string类型,它包含s中下标为pos起的1en个字符
s. erase (pos, len)删除s中下标为pos开始的len个字符
s. replace(pos, len,s2)删除s中下标为pos的len个字符,并在下标为pos处插入s2
s. find(s2, pos)在s中以pos位置起查找s2第一次出现的位置,若查找不到返回string::nops
s. c_ str()返回一个与s字面值相同的C风格的字符串临时指针
#include<string>
#include<iostream>
using namespace std;
int main()
{
	string s1 = "1234", s2 = "4321";
	int a, b;
	sscanf(s1.c_str(), "%d", &a);//sscanf()的作用是从字符数组中读入
	sscanf(s2.c_str(), "%d", &b);
	cout << a + b << endl;//输出的是5555 
	return 0;
}

栈(STACK)

栈示意图:先进后出的结构
在这里插入图片描述

#include<stack>
......
stack<int > s;
/*中间尖括号里是栈的类型,可以是string,char,etc.
  s是变量名*/
empty()//堆栈为空则返回真
pop()//移除栈顶元素
push()/*在栈顶增加元素  为保险起见,通常限制栈的大小
		.......
		#define STACK_SIZE 100//限制栈的容量为100
		.......
			if(s.size()<STACK_SIZE)
				s.push(68);
		.......*/
size()//返回栈中元素数目
top()//返回栈顶元素

FIFO队列和优先队列

FIFO队列示意图(先进先出的结构):
在这里插入图片描述

#include<queue>
//定义FIFO队列
queue<类型名>变量名
queue<int> que//定义que为一个int类型的FIFO队列
queue<char>a//定义a为一个char类型的FIFO队列
queue<data>c/*定义c为一个data类型的FIFO队列其
中data为自定义的数据类型,可以为结构体*/

FIFO队列的状态:
1.队空:队列中没有任何元素。
2.队满:队列空间已全被占用。
3.溢出:当队列已满,却还有元素要入队,就会出现“上溢(overflow) ”;
当队列已空,却还要做“出队”操作,就会出现“下溢(underflow) ”。
两种情况合在一起称为队列的“溢出。

操作说明
q. empty ()如果队列为空,则返回true,否则返回false
q. size ()返回队列中元素的个数
q. pop ()删除队首元素,但不返回其值
q.front()返回队首元素的值,但不删除设元素(仅适用于FIFO队列)
q. back ()返回队尾元素的值,但不删除该元素(仅适用于FIFO队列)
q. top ()返回具有最高优先级的元素的值,但不删除该元素(仅适用于优先队列
q. push()对于queue,在队尾压入一个新元素 ;对于priority_ queue,在基于优先级的适当位置插入新元素

循环队列
在这里插入图片描述

动态数组(vector)

为了节省空间,有时我们会使用动态数组vector

#include <vector>
vector<类型名>变量名
vector<int>que //定义que为一个int类型的动态数组
vector<char>a  //定义a为一个char类型的动态数组
vector<data>c  // 其中data为自定义的数据类型,可以为结构体
操作说明
a[i]返回动态数组中的第i个元素
a.empty()若动态数组为空,则返回true,否则返回false
a.size()返回动态数组中元素的个数
a.resize()修改动态数组大小
a.push_ back()向动态数组尾部插入一个元素
a.pop_ back()删除动态数组尾部的一个元素
a.begin()返回指向vector头部的迭代器(指针)
a.end()返回指向vector尾部元素的后一个元素的迭代器( 指针)

利用C++动态数组实现的排序代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	vector<int> a;//动态数组
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		int tmp;
		scanf("%d", &tmp);
		a.push_back(tmp);
	}
	sort(a.begin(), a.end());
	for (int i = 0; i < a.size(); i++)printf("%d ", a[i]);
	printf("\n");
	return 0;
}

map

在实际应用中,我们可以使用map容器来作为一个有序的映射表,可以将其看做是一个下标可以是任何类型的数组。对map单次操作的时间复杂度O(lgn)。
定义map

map<类型1,类型2>变量名;
map<string, int> ma; // 定义ma为一个从string到int的一个映射

访问map中的元素

map<string, int> ma;//定义ma
ma[“abc"]=2;//将字符串”abc"映射到整数”2”上
cout << ma["abc"] << endl; //屏幕上将输出整数2

同时,map中的类型可以是自己定义的结构体,此时结构体中应该有重载小于符号

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值