我是靠谱客的博主 飘逸大山,最近开发中收集的这篇文章主要介绍C++基础一与算法相关的C++基础,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

与算法相关的C++基础

1:输入输出

类似于C语言scanf和printf,C++中使用cincout来更简便的进行输入输出。同样的scanf与printf声明于stdio.h头文件中,cin与cout声明于iostream中。

tips:C++为了区分头文件与C,将C中头文件后缀.h去掉了。若要使用C的头文件则是在头文件名称前加上c。例如<cstdio>

1:cin:istream对象,cout:ostream对象

使用方法:

#include<iostream>
using namespace std;//声明使用哪一个命名空间,此处使用std即标准库
int main()
{
int n;
cout<<"请输入一个数字:";//"<<"为输出运算符
cin>>n;//">>"为输入运算符
cout<<"您输入的数字是:"<<n<<endl;
return 0;
}

以上代码的运行不做展示,若不了解可自行运行。

2: 操纵符endl

endl称为操纵符:结束当前行,切换到下一行,同时它可以将输出缓冲区中的内容全部刷到设备中(输出显示),达到刷新缓冲区的效果。不过我们一般使用它来换行。

3:输入运算符:>>

左侧为一个istream对象,右侧运算对象为待接收数据的变量,至少一个。

int n;char m;
cin>>n>>m;

cin的输入同scanf一样,在遇到空格或回车等结束读入。

4:输出运算符:<<

左侧为一个ostream对象,右侧运算对象为待打印变量,至少一个。

cout<<n<<m;

tips:

cin,cout由于输入输出缓冲区会花费一些时间,因此会造成某些算法题超时,所以若某些算法题对时间有要求的话还是采用scanf和printf。

针对更为苛刻时间的算法题:快读

一般scanf,就够用了,不过有些BT的题咱也没办法。不管碰到没有,先了解一下也没啥关系。计算机能快速识别的是字符,平时我们输入数字,底部也是将字符转化为数字,根据这一道理,可以写出快读核心。

#include<stdio.h>
int read() {
int num = 0, sign = 1;
char temp = getchar();
while (temp<'0' || temp>'9') {
if (temp == '-') sign = -1;
temp = getchar();
}
while (temp >= '0'&&temp <= '9') {
num = num * 10 + temp - '0', temp = getchar();
}
return sign * num;
}
int main()
{
printf("%dn", read());
printf("%d", read());
return 0;
}

既然有快读,当然也有快写。快读使用gerchar(),对应的快写使用putchar()。不常用这里不做展示。

格式化输出(了解)

printf可以通过占位符指定输出位数。C++同样也可以,但是相比于printf使用得较少。建议写题要是碰见了还是用printf吧。
C++的基本输入输出

2:命名空间

命名空间简单来讲就是为了区分同名的事物。
比如:有一个码农A,另一个码农B,A喜欢定义名为handsome的变量,B也喜欢定义名为handsome的变量。然后你有一天同时使用了A,B这两个人的代码,恰好你也要使用其中名为handsome变量,这时候如何区分你使用的是哪一个头文件中的handsome就需要用到命名空间了。

1:域操作符:::

语法:命名空间::名字。意思是从左侧命名空间中找到右侧的名字。名字可以是变量,也可以是类型。

#include<iostream>
using namespace std;
namespace A {
int handsome = 5;
}
namespace B {
int handsome = 6;
}
int main()
{
cout << "A:handsome: " << A::handsome << endl;
cout << "B:handsome: " << B::handsome << endl;
return 0;
}

结果:

A:handsome: 5
B:handsome: 6

2:命名空间的using声明

想必你也觉得每次都要使用::召唤名字出来比较麻烦,所以大多数都使用using 声明。
语法:using namespace 命名空间名称;
这样你应该明白了using namespace std;的含义。因为cin,cout都存在于std这个命名空间中。

3: 名字单独的使用using声明

若你想用std中的cin,cout,但是不想使用std这个命名空间,则可以单独声明我要使用哪一个名称。
语法:using 命名空间::名称

using std::cin;
using std::cout;

注:头文件中不应该包含using声明

3:字符串string

标准库类型string表示可变长序列,声明于头文件中,string名称也定义在std中。

1:string对象的定义与初始化
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s(6, '6');//s内容为666666
string s1;//定义一个s1,默认初始化为一个空串
string s2 = "hello string";//s2为该字符串字面值的拷贝
string s3 = s2;//s3为s2的拷贝
string s4(s2);//s4为s3的拷贝 等价于s4=s2
string s5("hello string");//s5为该字符串字面值的拷贝
//大括号初始化,由于C++初始化方式太多,
//有的类支持某种初始化方式,有的类不支持。
//于是C++新标准推出了大括号初始化,适用于所有标准库类
string s6{ "hello world" };
string s7{ s };
return 0;
}
2:读写string对象
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
cin >> a;
cout << a;
return 0;
}

输入:     abcdefg
输出:abcdefg
解释:string对象会忽略开头的空白,并从第一个真正的字符开始读,直到遇见下一个空白。

使用getline读取一整行

	string a;
getline(cin, a);
cout << a << endl;

输入:     abcdefg
输出:     abcdefg
解释:getline从给定流中读取内容,遇到换行符结束.

3:string对象上的一些操作

#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "hello";
s.empty();//判定字符串是否为空
s.at(3);//返回下标为3处的字符,并且会坚持是否越界
s[3];//不会检查是否越界
s += " world";//将s1与" world"连接后的字符串拷贝给s
s.size();//返回s中字符的个数
s.length();//返回字符串长度 常用
if (s > "hello world")//可以进行比较操作,按照字典顺序
cout << "big";
else if (s < "hello world")
cout << "small";
else cout << "equal";
return 0;
}

tips:范围for循环

for (auto c : s)
cout << c;

auto自动类型推导,这里从s中推导出来的类型为char。所以c的类型为char。然后将s中的字符逐个拷贝给c,因此改变c的值并不会影响s中字符的值。

题外话之引用:&

程序运行时间是衡量一个程序好坏的一个重要标准之一。然而函数参数传递和平时的一些不必要的拷贝严重的浪费了资源和时间。
引用=取别名,就是说我只是给这个变量换了一个名字,并且通过这个名字可以直接访问这个变量。注意引用必须初始化(毕竟首先要有这个东西,才能给它取外号)

int main()
{
int a = 5;
int &b = a;//b为a的别名
cout << b << endl;
b = 6;
cout << a << endl;
return 0;
}

因此函数传参使用引用可以达到传地址的效果。同理,上面题到的范围for循环,若想减少拷贝,还可以改变其中的值的话,就可以使用引用。若单纯为了减少拷贝,而不需要改变其中的值的话,就可以加上const。

最后

以上就是飘逸大山为你收集整理的C++基础一与算法相关的C++基础的全部内容,希望文章能够帮你解决C++基础一与算法相关的C++基础所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(108)

评论列表共有 0 条评论

立即
投稿
返回
顶部