@Author:Runsen

C++的标准模板库(STL)是提供数组、向量、队列等数据结构的模板类的集合。STL是由容器、算法、迭代器组成的库。

容器

容器存储对象和数据。它们基本上是基于模板的泛型类。

STL中的容器分为以下几种:

  • 顺序容器
    可以以顺序或线性方式访问的容器称为顺序容器。

Array, vector, queue, deque, list, map, set 是线性存储数据的 STL 容器,可以按顺序访问。

  • 关联容器

关联容器是实现排序数据结构的容器。这些容器可以快速搜索。关联容器的一些示例是 Map、Set、MultiMap、Multiset 等。这些容器通常以键/值对的方式实现。

Arrays

声明Arrays 容器的一般语法是:

array<object_type, size> array_name;

上面的声明创建了一个数组容器“array_name”,其大小为“size”,对象类型为“object_type”。

我们也可以初始化这个数组容器,如下所示,

array<int,5> myarray = {1,1,2,3,5};

数组容器支持的一些功能包括:

  • At:返回数组容器中给定位置的值。如果指定的位置超出数组限制,则抛出“Out_of_range”异常。
  • Front:返回数组容器中的第一个元素。
  • Back:如果容器被完全填满,则返回数组容器中的最后一个元素,另一个返回容器中最右边的元素。
  • Fill:为数组容器中的每个元素分配一个给定的值。
  • Swap:交换具有相同类型和相同大小索引的两个数组的内容。
  • Empty:用于检查数组容器是否为空的布尔函数。
  • Size:返回数组容器中的元素数。
  • Max_size:返回数组容器的最大大小。
  • Begin:返回指向数组容器开头的迭代器,即数组的第一个元素。
  • End:返回指向数组容器中最后一个元素旁边位置的迭代器。
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>using namespace std;int main() {array<int, 5> myarray = {1, 1, 2, 3, 5};cout << "Size of array: " << endl;cout << myarray.size() << endl;cout << "myarray contents: "  << endl;for (auto i : myarray)cout << i << ' ';// sort operationsort(myarray.begin(), myarray.end());cout << "\nsorted myarray : ";for (auto i : myarray)cout << i << ' ';cout<<"\nFirst element of myarray "<<myarray.at(0);cout<<endl;cout<<"FRONT myarray: "<<myarray.front();cout<<endl;cout<<"BACK myarray: "<<myarray.back();cout<<endl;// Filling ar2 with 10myarray.fill(8);cout << "\nFilled myarray : ";for (auto i : myarray)cout << i << ' ';return 0;
}

输出如下

Size of array:
5myarray contents: 1 1 2 3 5
sorted myarray: 1 1 2 3 5
The first element of myarray 1
FRONT myarray: 1
BACK myarray: 5Filled myarray: 8 8 8 8 8

vector

array是固定大小的静态数组。

如果在程序中间我们必须在数组中存储更多元素,那么当我们尝试存储超出数组限制的元素时,肯定会得到“out_of_bound”异常。

vector是动态数组容器,可在插入或删除元素时自动调整其大小。向量的存储由向量容器本身处理。

vector中的元素存储在连续的位置。就像数组一样,向量元素也可以使用迭代器遍历和访问。

vector支持以下迭代器函数来遍历元素:

  • begin() –返回指向向量容器第一个元素的迭代器。
  • end() –返回指向向量中最后一个元素之后的元素的迭代器。
  • rbegin() –返回指向向量容器中最后一个元素的反向迭代器。
  • rend() –返回指向向量容器第一个元素的反向迭代器。
  • cbegin() –返回指向向量容器中第一个元素的常量迭代器。
  • cend() –返回指向向量容器最后一个元素之后的元素的常量迭代器。
  • crbegin() –返回指向向量容器中最后一个元素的反向常量迭代器。
    -crend() –返回指向向量容器中第一个元素的反向常量迭代器。
#include <iostream>
#include <vector>
using namespace std;
int main(){vector<int> v1;for (int i = 1; i <= 5; i++)v1.push_back(i+1);for (auto i = v1.begin(); i != v1.end(); ++i)cout << *i << " ";cout << "\nOutput of Vector with rbegin and rend: ";for (auto itr = v1.rbegin(); itr != v1.rend(); ++itr)cout << *itr << " ";cout << "\nOutput Vector of with cbegin and cend: ";for (auto itc = v1.cbegin(); itc != v1.cend(); ++itc)cout << *itc << " ";cout << "\nOutput Vector of with crbegin and crend : ";for (auto icr = v1.crbegin(); icr != v1.crend(); ++icr)cout << *icr << " ";return 0;
}

输出如下:

Output of Vector with rbegin and rend: 6 5 4 3 2
Output Vector of with cbegin and cend: 2 3 4 5 6
Output Vector of with crbegin and crend: 6 5 4 3 2

函数 size() 返回向量容器中的元素数。这是 std::vector 类的内置函数,可直接用于查找向量的大小。

我们还可以将向量调整为所需的大小,使其可以容纳“n”个元素。这是通过 std::vector类的“resize()”函数实现的。resize 函数以向量的大小为参数,然后将向量容器的大小调整为指定的大小。

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> myvec = {1, 1, 2, 3, 5, 8};cout << "Vector Size : " << myvec.size();cout << "\nVector elements are: ";for (auto it = myvec.begin(); it != myvec.end(); it++)cout << *it << " ";myvec.resize(4);cout << "\nVector Size after resize: " << myvec.size();cout << "\nVector elements after resizing are: ";for (auto it = myvec.begin(); it != myvec.end(); it++)cout << *it << " ";return 0;
}

输出如下:

Vector Size : 6
Vector elements are: 1 1 2 3 5 8
Vector Size after resize: 4
Vector elements after resizing are: 1 1 2 3

对向量进行排序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{vector<int> myvec = { 10,50,30,20,60,40 };for (auto i = myvec.begin(); i < myvec.end(); ++i){cout << *i << " ";}cout << endl;sort(myvec.begin(), myvec.end());for (auto i = myvec.begin(); i < myvec.end(); ++i){cout << *i << " ";}cout << endl;
}

输出如下

10 50 30 20 60 40
10 20 30 40 50 60

向量类 std::vector 提供了另一个将值插入向量的函数Insert 。Insert 函数允许我们在指定位置之前向向量中插入元素。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> myvec = { 2,3,4 };for (int i = 0; i < myvec.size(); i++)cout << myvec[i] << " ";cout << endl;myvec.insert(myvec.begin(), 20);myvec.insert(myvec.begin() + 1, 30);for (int i = 0; i < myvec.size(); i++)cout << myvec[i] << " ";
}

输出如下

2 3 4
20 30 2 3 4

vector 类还为我们提供了将一个向量的内容与另一个相同类型和大小的向量的内容交换或交换的能力。这是通过矢量内置函数“swap”实现的。

#include <iostream>
#include <vector>
using namespace std;int main()
{// swap operationvector<int> v1, v2;v1.push_back(1);v1.push_back(3);v2.push_back(5);v2.push_back(7);cout << "\nVector 1: ";for (int i = 0; i < v1.size(); i++)cout << v1[i] << " ";cout << "\nVector 2: ";for (int i = 0; i < v2.size(); i++)cout << v2[i] << " ";// Swaps v1 and v2v1.swap(v2);cout << "\nAfter Swap \nVector 1: ";for (int i = 0; i < v1.size(); i++)cout << v1[i] << " ";cout << "\nVector 2: ";for (int i = 0; i < v2.size(); i++)cout << v2[i] << " ";
}

输出如下

Vector 1: 1 3
Vector 2: 5 7
After Swap
Vector 1: 5 7
Vector 2: 1 3

函数“find”用于查找向量中是否存在特定元素(称为键)。一旦找到该值,函数就会返回。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{// Assign vectorvector<int> myvec = {1,1,2,3,5,8};cout<<"\nInput vector: ";for(auto it=myvec.begin();it<myvec.end();it++)cout<<*it<<" ";int key;cout<<"\nEnter the key to be searched: "; cin>>key;if(find(myvec.begin(),myvec.end(),key)!= myvec.end())cout<<"\nElement found";elsecout<<"\nElement not found";}

【小白学习C++ 教程】二十一、C++ 中的STL容器Arrays和vector相关推荐

  1. 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map

    @Author:Runsen STL 中的栈容器是一种容器适配器.在栈容器中,元素在一端插入并在同一端删除. stack 为了实现堆栈容器,我们需要在我们的程序中包含头文件<stack>. ...

  2. 【小白学习C++ 教程】十一、C++类中访问修饰符

    @Author:Runsen 类是面向对象编程.它是一种用户定义的数据类型,它拥有自己的数据成员和成员函数,可以通过创建该类的实例来访问和使用它们. 一个对象是一个类的实例.定义类时,不会分配内存,但 ...

  3. 【小白学习keras教程】十一、Keras中文本处理Text preprocessing

    @Author:Runsen 文章目录 Text preprocessing Tokenization of a sentence One-hot encoding Padding sequences ...

  4. 【小白学习PyTorch教程】十一、基于MNIST数据集训练第一个生成性对抗网络

    「@Author:Runsen」 GAN 是使用两个神经网络模型训练的生成模型.一种模型称为生成网络模型,它学习生成新的似是而非的样本.另一个模型被称为判别网络,它学习区分生成的例子和真实的例子. 生 ...

  5. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  6. 线程本地存储器——Windows核心编程学习手札之二十一

    线程本地存储器 --Windows核心编程学习手札之二十一 C/C++运行期库使用线程本地存储器,运行期库是在多线程应用程序出现前设计的,因此运行期库里的大多数函数是用于单线程应用程序的.函数strt ...

  7. jQuery学习(十二)—jQuery中对象的查找方法总结

    jQuery学习(十二)-jQuery中对象的查找方法总结 一.find方法 作用:在元素1中查找元素2,类似于选择器中的后代选择器 格式:元素1.find(元素2),元素2为CSS选择器或者jQue ...

  8. 群晖NAS教程(二十一)、利用Docker安装DDNS动态域名解析,自动更新域名解析到公网IP(支持阿里云、腾讯云dnspod、Cloudflare、华为云)

    群晖NAS教程(二十一).利用Docker安装DDNS动态域名解析,自动更新域名解析到公网IP(支持阿里云.腾讯云dnspod.Cloudflare.华为云) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森 ...

  9. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

最新文章

  1. 利用ISA2006封杀QQ2010
  2. ThinkPHP php 仿千图网源码_PHP微信表白墙源码 基于ThinkPHP框架开发
  3. [转] iphoneX、iphoneXS、iphoneXSMax、iphoneXR适配
  4. Zull路由网关---SpringCloud
  5. 基因疗法真的有效吗?治疗技术前景又如何?
  6. 基于 socket.io 实现实时你画我猜游戏
  7. matlab2c使用c++实现matlab函数开发配置全解
  8. android授权新浪微博 服务端,android应用关于新浪微博授权登陆解决方案
  9. 结合springboot搭建日志采集系统EFK
  10. Day01_01_Linux_Ubuntu教程之Linux系统简介
  11. 控制进度-监控管理过程组
  12. 人到中年:“无爱、无话、无性”
  13. 决策树(四):使用决策树预测隐形眼镜类型
  14. windows 设置设置程序的起始位置
  15. win7计算机里没有网络图标,Win7网络图标不见了怎么办?Win7系统找回网络图标的方法...
  16. NOIP 考后欢乐赛 T2 中国象棋
  17. 2018上海市六一计算机创新活动,《梦幻西游》电脑版2018六一儿童节活动
  18. ServU漏洞利用靶场-单兵作战
  19. php正则怎么用,php正则的使用
  20. 超融合架构提升单台服务器性能,浅谈超融合架构

热门文章

  1. Linux opencv安装与编译
  2. couchdb 自动生成html,如何在CouchDB中使用html模板
  3. connection refused_ERR_CONNECTION_REFUSED
  4. 金融运营智能化搞不定?百度智能云有妙方
  5. springboot 控制台输出错误信息_高级码农Spring Boot实战进阶之过滤器、拦截器的使用...
  6. webstorm如何自动换行_怎样在word中自动生成目录
  7. 6.4 JAVA 方法重载
  8. .net EF框架 MySql实现实例
  9. svn clean up 出错解决方案
  10. [Objective-C] 020_ Block