STL容器

Posted 上进小青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL容器相关的知识,希望对你有一定的参考价值。

啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊

#include<iomanip>

主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:
dec 置基数为10 相当于"%d"
hex 置基数为16 相当于"%X"
oct 置基数为8 相当于"%o"
setfill( \'c\' ) 设填充字符为c
setprecision( n ) 设显示有效数字为n位
setw( n ) 设域宽为n个字符
cout.setf(ios::fixed);
cout<<setprecision(n);输出的数字为n位于长度,不全的地方用0补全
 
 
 
对于某些竞赛题目,会很恶心的用输入输出的格式来考验是否会超时,而cin.cout确实是比scanf.printf慢一些,而string也会比char慢会超时
ios::sync_with_stdio(false);就是给cin。cout加速的东东。。
 
 
 
string类型只能用cin,cout来输入输出,用printf,scanf是不可以的
 
 
fabs(double) abs(int);的绝对值
 
strchr(char a[],char b)用于返回a中b字符首次出现的位置及该字符串后面的字符
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    char a[100], b[100];
    cin >> b;
    strcpy(a, b);
    cout << a << ":::" << b << endl;
    strcat(a, b);
    cout << a << endl;
    char *q = strchr(a, \'a\');///在这里该函数返回\'a\'出现的首地址,当找不到‘a’时返回NULL,具体看下图
    cout << q << endl;
    cout << strcmp(a, b) << ":::" << strcmp(b, a) << ":::" << strcmp(a,a) <<endl;
    int l = strlen(a);
    cout << l << endl;
}

 

 

在网上查到过,在好多论文中提到过memset中存在某种机制,将会使得它比for的循环赋值快一些

 

全排列函数next_permutation();用于求算字符串或者数组的全排列,

**但是尤为要注意的一点是该函数只会返回从给定的字符串或者数组字典序之后的序列,也就是说当我们想要求出全排列的时候我们应该先为数组或者字符串排序

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     string s="bca";
 7     sort(s.begin(),s.end());
 8     cout<<s<<endl;
 9     while(next_permutation(s.begin(),s.end()))
10     {
11         cout<<s<<endl;
12     }
13 }

排序时的结果

 

 未排序时的结果

 

没有第8行时的结果

 

排序int型数组

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int a[5]= {2,3,1};
 7     sort(a,a+3);
 8     cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
 9     while(next_permutation(a,a+3))
10     {
11         cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
12     }
13 }

在比赛中积累的经验得知,这个求全排列的函数比我们自己写的用dfs求的全排列要快

 

对于平时的时间要求较高的题目,我们会用到二分查找,但是对于边界我们却总是不能正确找到,这里有一个二分查找的函数,它的时间复杂度时log级别的

lower_bound(a,a+n,b);求该函数返回在a数组中b首次出现的地址

upper_bound(a,a+n,b);求该函数返回在a数组中b末次出现的地址

**要注意的一点是对于a数组在它传递给该函数的时候要严格遵守升序排列才能找到,因为这个函数时严格遵守二分查找的法则,否则就会报错

1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4 int main()
5 {
6     int a[]={3,2,2,1,0};
7     cout << lower_bound(a,a+5,2)-a << endl;
8     cout << upper_bound(a,a+5,2)-a << endl;
9 }

 

 

 对于string类型用sort排序方法

string s="abc";

sort(s.begin(),s.end());

 

 

以上是关于STL容器的主要内容,如果未能解决你的问题,请参考以下文章

STL容器自定义内存分配器

c++ 容器含义

STL源代码剖析 容器 stl_stack.h

STL源代码剖析 容器 stl_deque.h

STL源代码剖析 容器 stl_vector.h

STL 容器的概念