一、STL 是什么?以及STL的库函数?
首先,STL是提高C++编写效率的利器!
1、介绍第一个容器:vector函数
每次引用该函数时要包含头文件#include <vector>;
vector: 是什么:vector是变长数组,支持随机访问,不支持在任意位置 O(1)O(1) 插入。为了保证效率,元素的增删一般应该在末尾进行。
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<vector> using namespace std; int main() { vector<int> a({ 1,2,3 });//生成一个int 类型的vector数组,初始化 vector<int> b[233]; //生成一个int 类型的vector数组,且有233个元素 //vector有很多函数 a.size();//是告诉我们这个数组的长度是多少 a.empty();//是告诉我们这个数组是否为空,empty函数返回一个bool类型,如果为空返回ture a.clear(); //clear函数把vector清空。 //定义a的迭代器 vector<int> ::iterator it = a.begin(); //begin 一般表示第一个, 而end表示最后一个的下一个(注意) //it + 2 等价 a[2]; *a.begin() = a[0];//*表示解引用 struct Rec { int x, y; }; vector<Rec> c;//包括生成一个结构体也是欧克的。 //接下来讲遍历vector数组 for (int i = 0; i < a.size(); i++) { cout << a[i] << ' '; } for (vector<int> ::iterator i = a.begin(); i != a.end(); i++) cout << *i << ' '; for (auto i = a.begin(); i != a.end(); i++) cout << *i << ' '; return 0 ; }
** 迭代器
迭代器就像STL容器的“指针”,可以用星号*操作符解除引用。
一个保存int的vector的迭代器声明方法为:
vector<int>::iterator it;
vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。
**begin/end函数
begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。
所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n 个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n = a.size()。
**front/back
front函数返回vector的第一个元素,等价于*a.begin()和a[0]。
back函数返回vector的最后一个元素,等价于*--a.end()和a[a.size() – 1]。
**push_back()和pop_back()
a.push_back(x)把元素x插入到vector a的尾部。
b.pop_back()删除vector a的最后一个元素。
二、使用步骤
1.查找字串
思路:因为第二行字符串以空格作为分割,所以用二维数组将字符串中的每个单词分别存入一行,再利用for循环用strcmp进行比较。
#include<stdio.h> #include<string.h> #define N 110 //首先先写一个大写转小写的函数 void change(char str[110]) { int i = 0; for(i = 0; str[i]; i ++) { if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 32; } } char a[N][N] = {0};//定义一个字符串类型的二维数组 char s1[N] = {0};//用来接收 第一行的单词 char s2[N] = {0};//用来接收第二行字符串 int main () { int cnt = 0;//计数器 int l =0, r =0; int i = 0; gets(s1); gets(s2); change(s1); change(s2); for(i = 0; s2[i]; i++) { if(s2[i] != ' ') a[r][l++] = s2[i]; else { r++; l = 0; } } for(l = 0; l <= r; l++) { if(strcmp(s1, a[l]) == 0) cnt ++; } printf("%d ", cnt); return 0; }
2、 平方矩阵
输入格式:
输入包含多行,每行包含一个整数 NN。
当输入行为 N=0N=0 时,表示输入结束,且该行无需作任何处理。
输出格式:
对于每个输入整数 NN,输出一个满足要求的 NN 阶二维数组。
每个数组占 NN 行,每行包含 NN 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
输出范围:
0≤N≤100
输入样例:
1 2 3 4 5 0
输出数据:
1 1 2 2 1 1 2 3 2 1 2 3 2 1 1 2 3 4 2 1 2 3 3 2 1 2 4 3 2 1 1 2 3 4 5 2 1 2 3 4 3 2 1 2 3 4 3 2 1 2 5 4 3 2 1
#include<iostream> using namespace std; const int N = 110; int n; int a[N][N]; int main () { while(cin >>n , n) { for(int i = 1; i <= n; i++) { for(int j = i, k = 1; j<= n; k++, j++)//固定了对角线的值为1, 且按对角线右上角的值递增 { a[i][j] = k;//将右上角的数按对角线对称到左下角。 a[j][i] = k; } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) cout << a[i][j] <<' '; cout << endl; } cout <<endl; } return 0; }
3、旋转摆花(蛇形数组)
解题思路:设置一个方向数组dx[], 和dy[];
题目要求:输入两个整数 nn 和 mm,输出一个 nn 行 mm 列的矩阵,将数字 11 到 n×mn×m 按照回字蛇形填充至矩阵中。
方向数组:绕点x(x, y);
输入样例:
3 3
输出样例:
1 2 3 8 9 4 7 6 5
#include<iostream> using namespace std; const int N = 110; int q[N][N]; int n, m; int main () { cin >> n >> m; int i , j; int d = 1, x = 0, y = 0; int dx[] = {-1, 0, 1, 0}, dy[] = { 0, 1, 0, -1 };//设置方向数组 for(i = 1; i <= n * m; i++) { q[x][y] = i; int a = x + dx[d], b = y + dy[d]; if( a < 0 || a >= n || b < 0 || b >= m || q[a][b]) { d = (d + 1) % 4; a = x + dx[d], b = y + dy[d]; } x = a, y = b; } for(i = 0; i < n; i++) { for(j = 0; j < m; j++) cout << q[i][j] <<" "; cout <<endl; } return 0; }
总结
提示:这里对文章进行总结:
上文总结了STL函数中的vector 函数,以及详细介绍了查找字串,平方矩阵,以及旋转摆花详解。
下节继续介绍STL的其他函数。