stl标准库

版权声明:如要转载,请注明出处,谢谢 https://blog.csdn.net/yezonghui/article/details/78691996
       为了准备ccf认证考试,我也大概拼搏了三周,可能是由于基础太差,也有可能是因为三周时间太短,现在感觉脑袋里面一团浆糊,反正就是感觉编程能力远远不够,信心非常缺乏,思路也十分混乱,一些关键小知识点也十分游离。

       接下来我主要总结这几周做ccf,遇见的一些基本常识,c++环境,stl标准,基本语法等。

.#include<bits/stdc++.h>这是一个c++的万能头文件,它包括c++的所有库函数(如下图1)。例如我们经常使用的

#include<iostream>
#include<cstdio>//相当于我们以前c里面的#include<stdio.h>含有标准的输入输出。
#include<algorithm>
#include<map>
#include<vector>
#include<string>
结合图一:我想进行简单展开叙述大学生经常用到几个库到底是什么

1.结合图一:我想进行简单展开叙述大学生经常用到几个库到底是什么
1)#include<algorithm>
//http://www.cplusplus.com/reference/algorithm/ 这个是#include<algorithm>详细包含所有函数的英文网站点击打开链接
a)非修改性操作:find(), find_first_of(),  count(),   equal(),  
               b)修改性操作:copy(), swap(),  replace(), unique(), 
              c)排序:sort(),   
               d)最大和最小:min(), max(), 
说明:自我感觉我们现在最基础的就是这几个,随着我后面的深入,在我掌握后我会进行新的补充,现在这里只是把这几个函数列出来
,待会下面将会对这些函数进行应用上的说明。
2) #include<iostream>
iostream是指iostream库。iostream的意思是输入输出流,直接点说就是in(输入) out(输出) stream(流),
取in、out的首字母与stream合成。
也就是我们要使用cin>>和cout<<就必须声明这个库。


3)#include<cstdio>
//相当于我们以前c里面的#include<stdio.h>含有标准的输入输出
有了<cstdio>我们就可以在c++里面使用c里面的printf()和scanf()了,因为c++里面的库都不带.h。
我提到这一点点据说想说以后我们用c++编程头文件就可以只写#include<bits/stdc++.h>,然后我们下面代码就可以随意运用c++库里面的函数
4)对于<map>,<vector>,<string>,我们将在后面用更大篇幅进行说明

       12345图112345      123456图2123456


 2.我想提醒几点的就是: 1)虽然这个这个头文件非常方便,但是我们为了打基础在平时训练中最好知道那个苦文件对应那些函数,
以便于自己加强掌控能力和搞清楚对应关系。
                        2)而且有一点值得提的是在正规考试,竞赛中我们只能运用stl标准库里面的函数。
                        3)写完头文件后不要忘了c++格式的这句话:using namespace std;.
  点击打开链接  //(见图二)具体stl标准我们可以参考这个文档。
(小编打算有时间会静下心来学习这个标准)


二:在这里,我提一下c++标准库简介,与stl的关系(因为小川本来向写#<string>相关问题,但是他不属于STL)
  1.C++标准库的所有头文件都没有扩展名
  2.C++标准库的内容分为10类:
         C1.语言支持 C2.输入/输出 C3.诊断 C4.一般工具 C5.字符串


       C6.容器 C7.迭代器支持 C8.算法 C9.数值操作 C10.本地化


  3.也就是是支持字符串处理的头文件 头文件 描述
为字符串类型提供支持和定义,包括单字节字符串(由char组成)的string和多字节字符串(由wchar_t组成)
  4.STL即标准模板库(Standard Template Library),它包括五大类组件:算法、容器、迭代器、函数对象、适配器。


   5.STL是C++标准库的一部分,但不是全部。C++标准库是std名字空间中的所有内容,就是那些不带.h的头文件,如


如std::string,及IO流都不属于STL,但它们是STL兼容的,可以应用迭代器,算法等。虽然std::string和IO流也是模板类,


但并不属于STL。


   6.标准库不是STL,STL是标准模板库,是标准库的一个子集。它是一个可复用的组件库,其中包含了很多实用的算法和数据结构。


stl是一个泛型思维的集中体现。


   上面部分解释参考博客  点击打开链接


三.#include<string>小结。具体全部百度见   点击打开链接


和 点击打开链接


1.str.length():返回字符串str的长度。(用法如下)(把length换成size效果是一样的。)


                    eg:     string  a;       cin>>a;        s=a.length();  结果显示s=8.


        易错提示,我们这里的a是string1类型的,如果我们用char a[12]来定义a,会报错。


虽然二者都可以表示一个字符串,但是类型不一样。






1)*讲到这我们就不得不提strlen()和length()的区别了,防止以后某天考试突然运行错误还找不到原因就懵逼了。


   a)两者都是求字符串的长度,但strlen( )的参数必须是char*  ;而 str.length( )是string类对象str调用的成员函数,所以它们用在不同的地方;


   b)在c++里面编程,我们对于.length()需要用到头文件#include<string>,而strlen()需要用到#include<string.h>或者#include<cstring>,不然会报错。
         对于上面提到的编译错误,我们以后编程可以统一写为#include<cstring>(#include<string.h>).


  c)一句话就是strlen(str)是用于求字符数组的长度;length()求字符串长度。


 2)*对于这两个三个计算长度的函数,我们要走出一个误区。


   a)正确理解: C++ string和'\0'没有半分钱的关系, 不会被截断。 string是个容器, 它对其中的字符透明。(暂且不知道理解的对不对)
   借鉴: 点击打开链接


   b)也就是说比如我们求字符串qwqdewce\0dfghchj,    \0会被当成两个字符长度,而不是把这个字符串从中间截断。


这个问题我们可以通过编译器进行尝试。


   c)到这,我又想到另外一个平时编程是遇到的问题。也同上面的容易产生误会,但完全不是一回事。例如,我们定义一个字符串后,
然后用从cin输入一些东西进去,输入 dewtyd   像这样当然没有问题,
但是如果我们这样输wsdgyw gdcej(也就是中间出现了一个空格)我们计算的长度只有空格前面的长度。为啥?
     在这里,千万不要误会,不要以为空格把字符串截断了,这是错误理解,真实原因是cin输入字符串时遇见空格就代表停止了,


空格后面的东西就相当于没有输进去。
 
     *补充插入:对于上面提到的这个getline()我迫不及待地想总结一下,因为这涉及到数据输入问题,这其实也是编程的基本功问题,有些题我们没有头绪有时就是因为不知道怎么把
   题目要求的数据输进去。
                                                                        a) cin:用法1:输入一个数字或字符
 用法2:接收一个字符串,遇“空格”、“TAB”、“回车”就结束.
也就是我们每次只能输入一个字符串就完了
 
                    b)getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include<string>”
例如:getline(cin,str);
包含<cstring>,<string.h>都可以。
                                                c)cin.getline():接收一个字符串,可以接收空格并输出
                                                                     char m[20];   cin.getline(m,5);
                                                               延伸:
                      cin.getline()实际上有三个参数,cin.getline(接收字符串的变量,接收字符个数,结束字符)
                                  当第三个参数省略时,系统默认为'\0'.


*插入一点(while(scanf(“%d%d”,&n,&e)!=EOF)):顺便提一个编程时候的小技巧(做题时遇到过):
对于大量数据输入,又没有结束标志的时候,我们一般人的思维就是
             while(1)
                                                                 {
                         scanf("%s",s1);
}






我们我们习惯默认不再输入就算结束了,但是我们怎么让系统知道呢?在平时写程序过程中如果是这种想法,可能会导致一个问题
(也就是我们不知道什么我们什么时候停止输入数据,就是我们手动输入一部分数据后,程序怎么知道数据是否还要继续输,
因此程序会一直等待。这样的话,平台就会显示编译超时,(反正浙大pat上是这样的).
对于上面提到的这个问题,我们就会想到一个解决办法:
插入解决方法:
我们可以kaol然后我们提交的这个系统或者平台肯定就会有自己的结构中断呀,它会向下图百度上说的一样,
产生可能是Ctrl+z这样的一个类似结构,因此我们就可以根据系统的这一特点来编写符合系统的语句。
于是我们可以用while(scanf(“%d%d”,&n,&e)!=EOF)或者把EOF换成-1也行,他们都是对的,
并且他们出错才返回EOF即-1.因为测试数据是系统自己给的,而且给了很多组,系统想停的时候,它就产生一个类似Ctrl+z的结构表明
测试数据就输入了这么多,开始进行运行测试了。
上述说了这么多就是表明一个意思while(scanf(“%d%d”,&n,&e)!=EOF)这句代码的思想哼重要,它起到了while(1){scanf("%d",&n;}
不能完成的效果。
图三:(解释scanf特性)
 
图3                           图3 


补充解释scanf():
具体归纳见下图四。


   图4                     图4

图四(scanf返回值问题)


也就是scanf()返回值是每一轮正确输入的数量,也就是一次正确输入的个数(一轮))错误之前就中断了。
还是如上面所说,遇见Ctrl+Z就强行结束输入了。
 重点:当然while(getline(cin, input))也是我们平常用的非常多的一个输入。我们可以用回车手动结束本次输入,先运行本次测试。
//也就是说作者输入一个处理一个的。即把需要大量的测试换成一行一行的,就不需要套用for循环来麻烦处理了。


以上三者的比较参考过别人的代码,深入理解可以借鉴点击打开链接或者


 点击打开链接






2.string的子串:substr函数
string substr(int pos = 0,int n = npos) ;//返回pos开始的n个字符组成的字符串
eg:string s("12345asdf");
string a=s.substr(0,5);  
     //获得字符串s中 从第0位开始的长度为5的字符串//默认时的长度为从开始位置到尾




3.C++中,string是一个类(注意,不是类型)。它的赋值,直接将字符串等于给它,或将同类的变量赋给它即可
通俗的说就是可以用等于号直接等于。eg:str1=str2;
另外判断两个字符串是否相等也可以直接用 if(str2==str1) 对于两个字符串的连接更是直接用加号就可以了。
eg:str1+str2; (这样我们就可以完全不用大一当时学的字符串的一些操作函数。
这些看似简单的操作极大地简化了我们的处理。
对于字符串我目前主要就是掌握了这些,先把这些总结下来。当然这些是远远不够的,后面我将会进行更加系统的归纳应用。








四。几个我之前熟练使用多次的标准函数的归纳总结。


(swap(), sort(), max(), min(), replace(), find(), ......)


1.swap()函数。
1)swap是用于交换两个变量的值的,需要使用


1
#include<algorithm>  //导入algorithm头文件才可以使用。这个函数在交换两个Int 类型的变量的时候,可以这样写


1
2
int x = 10, y = 20;                         // x:10 y:20
swap(x, y);
经过上面的操作后,x就等于20,y就等于10了.


2)swap(a[2],a[4]);//实现了数组中a[2]和a[4]的交换。
利用这一点交换我们可以实现一个比较常用的功能:把数组中某一个数向前或者向后移动具体个位置。
我们可以借助swap()函数,进行逐个交换,一直交换到具体位置位置。


3)我趁热打铁试了一试swap()对于字符串同样适用string str swap(str[2],str[4]);
#include<bits/stdc++.h>  
using namespace std;
int main()
{
    string str;
cin>>str;
swap(str[2],str[4]);
cout<<str;
return 0;

这个完全适用。


2.sort()函数
1)头文件:algorithm
2)对于(整数/字符)数组进行比较时,可直接通过sort(a,a+n)(其中你指数组的个数),默认升序排列,
3)快速实现降序时
借助C++库函数,greater<类型>()降序       less<类型>()升序     头文件:functional
eg: sort(a,a+10,greater<int>());


其实本来这里sort类似还有好几个函数的,但是由于涉及到vector,这里我们暂且打住,后面再继续学习后再总结。
平时对于数组的一些基本题,有事没事用sort排个序可能起到意想不到的作用。


3.max和min
  实际操作:int c=min(a[1],a[4]);大致就是这样,相当于判断两个函数的较大的或者较小的。
注意头文件为math


4.replace()
大致有九种用法: 点击打开链接
由于我本人没有自己编程实际体会,暂且不总结,后面再补上。


5.find函数
这个函数涉及的也非常广和实用
我会尽量全部弄明白


猜你喜欢

转载自blog.csdn.net/yezonghui/article/details/78691996