(C++) STL、常用的库函数和解题报告(1)

简介: (C++) STL、常用的库函数和解题报告(1)

一、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.查找字串


1669436454183.jpg


思路:因为第二行字符串以空格作为分割,所以用二维数组将字符串中的每个单词分别存入一行,再利用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);

image.png


输入样例:

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的其他函数。

相关文章
|
4天前
|
JSON C++ 数据格式
C++20 高性能基础库--兰亭集库助力开发者构建高性能应用
这次分享的主题是《高性能基础库--兰亭集库助力开发者构建高性能应用》的实践经验。主要分为三个部分: 1. 业务背景 2. 雅兰亭库架构 3. 业务优化
|
16天前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
36 11
|
22天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
28 1
|
1月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
51 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
97 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
101 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
78 2
|
1月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
46 0
|
12天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
52 18
|
12天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
38 13