c++基础知识——STL之vector,字符数组;

简介: c++基础知识——STL之vector,字符数组;

前言


提示:这里可以添加本文要记录的大概内容:


前面我们学习了c++中的相关知识,今天将c++基础知识中的STL讲完,在此之前,先来复习一下数组;

提示:以下是本篇文章正文内容,下面案例可供参考


一、数组的相关应用


1.冒泡排序和选择排序


选择排序


a740d65a66e67eb5e30a784431688430_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


代码如下(示例):


//按照降序排列
#include<iostream>
using namespace std;
int main(void)
{
  int a[100];
  int n;
  cin >> n;
  for (int i = 0; i < n; i++)
  {
  cin >> a[i];
  }
  for (int i = 0; i < n - 1; i++)
  {
  for (int j = i + 1; j < n; j++)
  {
    if (a[j] > a[i])
    {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
    }
  }
  }
  for (int i = 0; i < n; i++)
  {
  cout << a[i] << " ";
  }
  cout << endl;
}


04ab2ce81c2790d058ae175cd0310d1d_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


冒泡排序


冒泡排序就是每两个数据之间进行比较,相对于选择排序,时间复杂度更大.


//按照降序排列
#include<iostream>
using namespace std;
const int N = 100;
int main(void)
{
  int n;
  int a[N];
  cin >> n;
  for (int i = 0; i < n; i++)
  {
  cin >> a[i];
  }
  for (int i = 0; i < n -1; i++)
  {
  for (int j = 0; j < n - 1 - i; j++)
  {
    if (a[j] < a[j+1])
    {
    int temp = a[j];
    a[j] = a[j+1];
    a[j+1] = temp;
    }
  }
  }
  cout << "冒泡排序的结果为:" << endl;
  for (int i = 0; i < n; i++)
  {
  cout << a[i] << " ";
  }
  cout << endl;
}


6cec17f22ca021080573c7711b5e9eda_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


二分法查询(折半查询)


我们在对数据进行查询时,尤其是涉及到很多的数据的时候,如果利用循环进行查找的时候,会增大时间复杂度,这个时候利用二分法查询就可以提高效率,例如对所有中国人的信息查询,如果利用for()循环进行查询,则最多可能要查询13亿次,而利用二分法则30次就可以查询完毕.


d73e7edbcd508fa9199bec15c6d259f0_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


代码演示:


//按照降序排列
#include<iostream>
using namespace std;
const int N = 100;
int main(void)
{
  int n;
  int a[N];
  cin >> n;
  for (int i = 0; i < n; i++)
  {
  cin >> a[i];
  }
  int mid = (n) / 2;
  int m;
  cin >> m;//代表要查找的数;
  for (int i = 0; i<(n/2); i++)
  {
  if (a[mid] == m)
  {
    break;
  }
  else
  {
    if (a[mid] > m)
    {
    mid = (mid + 0) / 2;
    }
    else
    {
    mid = (mid + n - 1) / 2;
    }
  }
  }
  cout << "数据的位置在第:" << mid + 1 << "位";
  cout << endl;
}


5b12a613c670974d23b96fb09abfa331_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


二、STL之vector;


1.vector部分常用成员函数:


78c37c2ffe144de370e2dcb32e8db1ff_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


代码如下(示例):


vector之一维数组;
#include<iostream>
#include<vector>
using namespace std;
//输出向量中的所有元素
void prtVector(vector<int>a)
{
  for (int i = 0; i < a.size(); i++)
  {
  cout << a[i] << " ";
  }
  cout << endl;
}
int main(void)
{
  int n;
  cin >> n;
  vector<int>a(n);
  for (int i = 0; i < n; i++)
  {
  cin >> a[i];
  }
  prtVector(a);//调用函数输出动态数组;
  a.begin();
  cout << a.size() << endl;//数组长度;
  a.resize(2 * n, -1);
  prtVector(a);
  a.pop_back();
  prtVector(a);
  a.push_back(3);
  prtVector(a);
  a.insert(a.begin(), 10);//在起始位置插入10;
  prtVector(a);
  a.erase(a.begin() + 3);//删除第三个位置的元素;
  prtVector(a);
  a.clear();//清空数组;
}


29dd8c851f3b8e7376dedcc5c1ebe9ce_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-D6ZqP6ICM5Yqo,size_20,color_FFFFFF,t_70,g_se,x_16.png


vector之二维数组;

当题目没有给出二维数组的行数和列数的时候,就可以利用vector来声明动态数组;

第一种方法:


#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
  int a, b;//a行,b列;
  cin >> a >> b;
  vector<vector<int> >tv(a, vector<int>(b));//注意> >之间有空格;
  for (int i = 0; i < a; i++)
  {
  for (int j = 0; j < b; j++)
  {
    cin >> tv[i][j];
  }
  }
  for (int i = 0; i < a; i++)
  {
  for (int j = 0; j < b; j++)
  {
    cout << tv[i][j] << " ";
  }
  cout << endl;
  }
}



第二种方法:


#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
  int a, b;
  cin >> a >> b;
  vector<vector<int>>tv;//定义一个动态二维数组;
  tv.resize(a);//重置二维数组的行数;
  for (int i = 0; i < a; i++)
  {
  tv[i].resize(b);//重置二维数组列数,其实也可以定义不同的列数;
  }
  for (int i = 0; i < a; i++)
  {
  for (int j = 0; j < b; j++)
  {
    cin >> tv[i][j];
  }
  }
  for (int i = 0; i < a; i++)
  {
  for (int j = 0; j < b; j++)
  {
    cout << tv[i][j] << " ";
  }
  cout << endl;
  }
}


一、字符串和字符数组的相关应用


1.字符串

字符串常量是以双引号引用的字符序列,字符串结束符时’\0’,所以字符串实际占用内存字节数比它的长度多一.


1.字符数组

一维字符数组:

定义:char a[10]

二维字符数组:

定义:char a[10][13]

字符数组的初始化:char a[ ]={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’};

字符数组的重点在字符数组函数的应用:


4c3164f68f109d17c9082ba3fdbde990_e615066342a04710b7c3f5ab556d6adb.png


代码如下(示例):


#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int N = 80;
int main(void)
{
  char s[N], t[N];
  scanf("%s%s", s, t);
  printf("%s", s);
  cout << s << "    " << t << endl;
  cout << strlen(s) << "  " << strlen(t) << endl;
  strcpy(s, "hello word!");
  cout << s << endl;
  strcpy(t, "i like c++");
  cout << t << endl;
  strcat(s, t);//连接两个字符串;
  cout << s << endl;
  string str = s;
  cout << str;
  printf("%s", str.c_str());//成员函数c_str将string型数据转换为char型数据;
  return 0;
}


8a40a137a635bd6b18f72d16ec220561_a97df0c7de2f4f7797df3eef24775858.png



总结


本节讲了STL中的一些基础知识,下一节我们讲指针,熟练地掌握STL中的一些库函数,有助于帮助我们做题.

相关文章
|
7天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
20 5
|
17天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
21 1
|
30天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
48 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
84 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
94 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
70 2
|
29天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
59 0
|
1月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
39 0
|
7天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
44 18
|
7天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
32 13

热门文章

最新文章