【C++STL】C++ Standard Template Library三个重要元素

C++中STL用法超详细总结 目录 1 什么是STL? 2 STL内容介绍 2.1 容器 2.2 STL迭代器 2.3 算法 2.4 仿函数 2.4.1 概述 2.4.2 仿函数(functor)在编程语言中的应用  2.4.3 仿函数在STL中的定义 2.5 容器适配器 2.5.1 stack 2.5.2 queue & priority_queue 3 常用容器用法介绍  3.1 vec... 阅读详情

一、STL三个最重要的元素是容器,迭代器,算法
1.容器
容器是用来管理其他对象的对象,让用户来决定是使用值还是引用。容器一般用模板类来实现。STL并没有采用面向对象的技术,所以STL中并没有一个通用的容器类,即没有统一的基类。


2.迭代器

迭代器的工作方式如指针。根据不同的应用,它可能是普通的指针或者是对象指针。迭代器通常用来获取

容器中的元素,可以从第一个元素移动到另外一个元素,这些操作对外面都是隐藏的。
所有的迭代器都有++,解引用*,比较(==或!=)的能力。如果该迭代器不是一个普通的指针而是一个迭代对象,可以通过下面的函数来实现上面的功能。
// scheme of a simple iterator:
template<class T>
class Iterator {
public:
// constructors, destructor ....
bool operator==(const Iterator<T>&) const;
bool operator!=(const Iterator<T>&) const;
Iterator<T>& operator++(); // prefix
Iterator<T> operator++(int); // postfix
T& operator*() const;
T* operator->() const;
private:
// association with the container ...
};

3.算法
模板算法通过迭代器访问容器,不仅对用户自定义的数据类型支持,而且对C++内部的数据类型也支持。
 它们三者之间的关系就是:容器让迭代器可用,而算法则靠它们俩来实现。
  容器-->迭代器-->算法
            <--      <--

下面的程序用来说明用C数组和STL来实现函数find()的不同:

Example 1:不使用STL

#include<iostream> 
using namespace std;
typedef const int* IteratorType;//迭代器类型


IteratorType find(IteratorType begin, IteratorType end,
const int& Value) {
while(begin != end // 指针比较
&& *begin != Value) // 解引用并且对象比较
++begin; // 移动到下一个位置
return begin;
}

int main() {
const int Count = 100;
int aContainer[Count]; // 定义容器
IteratorType begin = aContainer; // 指向初始元素的指针
// 最后一个元素的后一个位置
IteratorType end = aContainer + Count;
// 用偶数填充容器
for(int i = 0; i < Count; ++i)
aContainer[i] = 2*i;


int Number = 0;
while(Number != -1)
{
cout << " 输入一个数字 (-1 = end):";
cin >> Number;
if(Number != -1) 
{ 
IteratorType position = find(begin, end, Number);
if (position != end)
cout << "元素的位置为: "<< (position - begin) << endl;
else
cout << Number << " 没有找到!" << endl;

}
}

}

从上面的程序可以看出,find()算法不需要知道容器的信息,仅仅通过指针(迭代器)来实现下面的功能:
a.++操作,实现移动到下一个元素
b.*操作解引用  c.这个指针必须允许通过!=进行比较运算

Example 2:通过模板来实现find函数。

template<class Iteratortype, class T>
Iteratortype find(Iteratortype begin, Iteratortype end,
const T& Value) 
{
while(begin != end&& *begin != Value) // 迭代器比较
++begin; 
return begin; 

}

这个函数允许迭代器的类型Iteratortype可以使用任何名字。

Example 3:使用STL,利用vector<T>类的方法来代替前面的begin和end返回迭代器

typedef vector<int>::const_iterator IteratorType;


template<class Iteratortype, class T>
Iteratortype find(Iteratortype begin, Iteratortype end,
const T& Value) {
while(begin != end // iterator comparison
&& *begin != Value) // object comparison
++begin; // next position
return begin;
}
int main() 
{

const int Count = 100;
vector<int> aContainer(Count); // define container
for(int i = 0; i < Count; ++i) // fill container with
aContainer[i] = 2*i; // even numbers
int Number = 0;
while(Number != -1) 
{
cout << " enter required number (-1 = end):";
cin >> Number;
if(Number != -1)
{
// use global find() defined above
IteratorType position =::find(aContainer.begin(), // use of container methods:
aContainer.end(), Number);
if (position != aContainer.end())
cout << "found at position "<< (position - aContainer.begin()) << endl;
else cout << Number << " not found!" << endl;

}

二、STL内部运作原理

下面通过用户自定义的类slist来说明STL的内部机制。为了保证这个类的迭代器不仅仅是一个简单的指针,该例子中不使用vector,使用单链表的形式。故不能通过索引随机访问该类中的元素。因此,这个容器通过方法push_front()来填充元素。函数find()用来表明用户自定义的类的行为和STL类的行为一样。slist的数据以及指向下一个元素的指针存放在private部分,并且提供一个公开的迭代器,这个迭代器对象保存了当前容器当前位置的属性值。
slist.h头文件

#ifndef SIMPLELIST_H
#define SIMPLELIST_H
namespace br_stl
{
#include<cassert>
#include<iterator>
template<class T>
class slist
{
 public:
typedef T value_type; 
typedef ptrdiff_t difference_type; //64位的int
typedef T* pointer;
typedef T& reference;
slist() : firstElement(0), Count(0) {}
~slist(){}
slist(const slist& sl)
: firstElement(0), Count(0)
{
if(!sl.empty()) 
{
iterator I = sl.begin();
push_front(*I++);
ListElement *last = firstElement;
while(I != sl.end()) 
{
// insert elements at the end to preserve the ordering

last->Next = new ListElement(*I++, 0);
last = last->Next;
++Count;
}

}
}


slist& operator=(const slist& sl) {
slist temp(sl);

std::swap(temp.firstElement, firstElement);
std::swap(temp.Count, Count);
return *this;
}

bool empty() const { return Count == 0;}
size_t size() const { return Count;}

void push_front(const T& Datum) 
{ // insert at beginning
firstElement = new ListElement(Datum, firstElement);
++Count;
}
private:
struct ListElement {
T Data;
ListElement *Next;
ListElement(const T& Datum, ListElement* p): Data(Datum), Next(p) {}
};

ListElement *firstElement;
size_t Count;
public:

class iterator {
public:
typedef std::forward_iterator_tag iterator_category;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
iterator(ListElement* Init = 0)
: current(Init){}
T& operator*() { // dereferencing
return current->Data;
}
const T& operator*() const { // dereferencing
return current->Data;
}
iterator& operator++() { // prefix
if(current) // not yet arrived at the end?
current = current->Next;
return *this;
}
iterator operator++(int) { // postfix
iterator temp = *this;
++*this;
return temp;
}
bool operator==(const iterator& x) const {
return current == x.current;
}
bool operator!=(const iterator& x) const {
return current != x.current;
}

private:
ListElement* current; // pointer to current element
}; // iterator

iterator begin() const { return iterator(firstElement);}
iterator end() const { return iterator();}

iterator erase(iterator position)
{
if(!firstElement) return end(); // empty list
iterator Successor = position;
++Successor;
// look for predecessor
ListElement *toBeDeleted = position.current,
*Predecessor = firstElement;
if(toBeDeleted != firstElement) {
while(Predecessor->Next != toBeDeleted)
Predecessor = Predecessor->Next;
Predecessor->Next = toBeDeleted->Next;
}
else // delete at firstElement
firstElement = toBeDeleted->Next;
delete toBeDeleted;
--Count;
return Successor;
}

void clear() 
{
while(begin() != end())
erase(begin());
}

};

 

template<class Iterator>
int operator-(Iterator second, Iterator first)
{
int count = 0;

while(first != second
&& first != Iterator()) 
{
++first;
++count;
}
// In case of inequality, second is not reachable by first
assert(first == second);
return count;
}

 


} // namespace br_stl

#endif


主函数:

#include<algorithm> // contains find()
#include<iostream>
#include"slist.h" 
int main() 
{

const int count = 100;
br_stl::slist<int> aContainer; // 定义容器
for(int i = count; i >= 0; --i) 
{ // fill the container with
aContainer.push_front(2*i); // even numbers
}

int Number = 0;
while(Number != -1) {
std::cout << " enter required number (-1 = end):";
std::cin >> Number;
if(Number != -1) {
// use of container methods:
br_stl::slist<int>::iterator Position =
std::find(aContainer.begin(),
aContainer.end(), Number);
if(Position != aContainer.end())
std::cout << "found at position "
<< (Position - aContainer.begin())
<< std::endl;
else
std::cout << Number << " not found!"
<< std::endl;
}
}
}

 

C++ Standard Library 阅读详情

相关推荐

c++ 以三个元素为组合枚举vector

int validTriangleNumber(vector<int>& nums) { // write code here int res=0; for(int i=0;i<=nums.size()-3;i++) { for(int j=i+1;j<=nums.size()-2;j++) { for(int k=j+1;k<nums.size();k++)

我不是码农的博客~~~ 1269

C++的stl库之简易数据结构pair和tuple

文章目录前言 前言 为了构造数据结构的方便简单,stl提供了两种简单的数据结构,用户想使用是,直接可以简单地构造一个简易的数据结构自己调用。 # 一,pair对

weixin_50605950的博客 773

UsualToolCMS-验证码绕过漏洞复现

本文以UsualToolCMS为靶场,复现了验证码绕过漏洞

小小小屿屿屿的博客 918

架构之路_深度探索C++对象模型总结

本文主要参照《深度探索C++对象模型》一书。 一、关于对象 C语言中,数据和处理数据的操作(函数)是分开声明的,不支持数据函数之间的关联性,称之为程序性的(procedural)。 1.1 对象类型 C++中可以通过独立抽象数据类型实现。比如: class Point3d { public: Point3d( float x = 0.0, float y = 0.0, float z = 0.0 ): _x(x), _y(y), _z(z){ } float x() { re

qq_35312463的博客 854

weblogic等保测评操作过程

weblogic网络安全等级测评保护操作

qq_48257021的博客 2757

机器学习系列(1)_逻辑回归初步

1、总述 逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。 2、由来     要说逻辑回归,我们得追溯到线性回归,想必大家对线性回归都有一定的了解,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹。如下图所示:     线性回归能对连续值结果进行预测,

寒小阳 13万+

C++数值计算工具

数值计算库: 科学计算领域的标准: BLAS 具体实现有OpenBLAS(汇编和C语言)、Intel MKL(针对Intel的特定CPU指令集的汇编代码)、Mir GLAS(D语言编写) LAPACK ARPACK 1、Eigen 纯头文件库; 2、Armadillo 特点: 所有的Armadillo的都定义在arma名空间下; Armadillo在arma::datum下定义包括pi和e在内的一些数学常量; Armadillo支持C++11的列表初始化语法来初始化对象; Armadillo支持

qq_36173446的博客 2751

【asrpro语音模块+语音控制小风扇】

智能语音控制小风扇,使用ASRPRO语音模块只要一句话就能设置小风扇不同挡位的风力。图形化编程简单有效的控制输出PWM的占空比。

qq_57234300的博客 1万+

C++对象模型——对象的差异(第一章)

1.3    对象的差异 (An Object Distinction)     C++程序设计模型直接支持三种programming paradigms(程序设计典范) 1.    程序模型 (procedural model)     就像C一样,C++当然也支持它,字符串的处理就是一个例子,可以使用字符数组以及str*函数集: char boy[] = "Danny"; char *

yiranant的专栏 905

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 430

PCL 点云拟合 最小二乘法拟合平面

在点云处理领域,最小二乘法(Least Squares)拟合是一种常用的数学方法,用于估计数据点的最佳拟合曲线或平面。平面拟合广泛应用于点云数据处理中的地面检测、物体表面分析等任务。 本文将介绍如何使用PCL库实现基于最小二乘法的平面拟合算法,通过拟合点云数据中的平面,来提取出数据的平面部分。

纵马踏花向自由 1026

[C++STL] vector size max_size capacity区别与理解

前言 C++STL中的vector有三个与容器大小相关的方法 size max_size capacity 它们看着相似,实则彼此不同,且初学时容易混淆。 这篇文章将帮助您对它们进行理解和区分。 一、方法功能 1. size size方法返回的是 当前 vector对象中 元素的个数。 刚刚初始化的空vector对象size的值为0。 2. capacity capacity方法返回的是当前程序已经分配给该vector对象的内存大小(单位为元素个数)。 3. max_size max_size方法

wingaso的博客 1338

《QGIS快速入门与应用基础》021:插件仓库 URL 获取与添加

详细介绍了在QGIS中添加第三方插件仓库的方法。首先强调必须从官方推荐、开源社区等可靠渠道获取插件仓库URL以确保安全性,并列出了4类可信获取渠道。文章分步骤讲解了URL添加流程,包括打开插件管理器设置面板、填写仓库信息、刷新缓存验证等操作。针对常见问题如URL格式错误、连接失败等提供了具体解决方案。最后总结指出,成功添加第三方仓库后即可直接搜索安装各类专业插件,从而扩展QGIS功能边界。全文注重实操指导,特别适合需要安装行业专用插件的QGIS用户参考。

LuckyHanMo的博客 463

【45C++STL-常用算法----3、常用排序算法】

这些C++常用算法,你需要掌握好.....

请关注我,不定时分享个人在大厂嵌入式开发工作经验 175

【EB-03】 AUTOSAR builder与EB RTE集成

打开EB工具后,在EB的步骤是:执行MultiTask(2)-> Mapping Component to Partitions(4)->Task Mapping(5)-> SvcAs_Trigger(7)-> Code Generation(8)如涉及新增BSW Module,也需要重复以上步骤。

libuping2023的博客 960

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C/C++基础进阶系列】C/C++ STL -- stl_algobase

【C/C++基础进阶系列】C/C++ STL -- stl_algobase 【1】fill函数分析 template <class _ForwardIter, class _Tp> void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value) { // 判断给定类型是否满足 _Mutable_ForwardIterator 性值 __STL_REQUIRES(_ForwardIter, .

CopperSun 技术博客 441

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STL学习记录(一):STL简介

STL简介 STL(The Stadard Template Librara)是C++学习中必须掌握的库。它提供了高效率的算来解决对一堆数据的管理,它让程序员能够直接获得数据结构和算法领域改进带来的好处,而不需要程序员去直接了解这些算法到底是怎么实现的。从程序员的角度来说,它提供了一系列应对...

chuojian5317的博客 111

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

在 C + + STL | std 中复制的不同方法: copy ()、 copy _ n ()、 copy _ if ()、 copy _ back ()

这个函数有4个参数,其中3个类似于 copy () ,还有一个附加函数,当返回 true 时,一个数字被复制,else 数字不被复制。: The pointer to the beginning of destination container, to where elements have to be started copying. 指向目标容器开头的指针,指向必须开始复制元素的位置。C + + STL 中存在各种各样的 copy () ,允许以不同的方式执行复制操作,它们都有自己的用途。

qq_40713201的博客 646

C++模板,STL(Standard Template Library)

这篇文章的主要内容是C++中的函数模板、类模板、STL的介绍。 希望对C++爱好者有所帮助,内容充实且干货,点赞+收藏防止找不到!

cx的学习经历 1369

STL(Standard Template Library)简介

即标准模板库,是惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list、vector、set、map等。同时,STL也是算法和其他一些组件的集合。STL现在是C++编程语言的一部分,因此不用安装额外的库文件。2 WHY STL开发STL的目的是标准化组件,这样就可以使用现成的组件,而不必在使用时重新开发了。STL是一个标准,只规定了STL的接口,内部实现没有要求。

liitdar的博客 1034

C++ Standard Template Library (STL)

模板 Template #include&lt;iostream&gt; using namespace std; template &lt;typename T&gt; T func(T a,T b){ return a+b; } int main(){ int a=1; int b=2; float c=3.0; float d=4.5; ...

WJF的博客 684

C++ 标准模板库(Standard Template Library,STL)

C++ 标准模板库StandardTemplateLibrary)是 C++ 标准库的一部分,不需要另外安装,直接导入即可使用。STL 为程序员提供了通用的模板类,这些模板类可以用来实现各种数据结构和算法,从而使程序员不必从头开始编写这些代码。STL 很好地实现了数据结构和算法的分离,大大降低了模块之间的耦合度,程序员可以自由组合 STL 提供的数据结构和算法。容器(Containers):各种数据结构,如vectordequemapset等。算法(Algorithms)

小嗷犬的博客 2824

Standard Template Library (STL) 算法

Standard Template Library (STL) 算法 1. 容器 容器是用来存储和组织其他对象的对象。 2. Standard Template Library (STL) 算法 算法是操作迭代器提供的一组对象的 STL 函数模板。因为对象是由迭代器提供的,所以算法不需要知道要处理的对象的来源。对象可以由容器中甚至流中的迭代器检索。因为迭代器的运行类似于指针,所以将迭代器作为实参的所有 STL 模板函数的运行都会与正常指针的运行相同。 容器、迭代器和算法。 当向容器的内容应用算法时,我们提

程永强 655

C++标准模板库STL(Standard Template Library)详解

C++ 标准模板库(Standard Template Library,STL)是一套功能强大的 C++ 模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。STL 的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定数据类型的代码。STL 分为多个组件,包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Function Objects)、适配器(Adapters)和 分配器(Allocators)等。使用 STL 的好处: 代码复

weixin_44156305的博客 2097

STL 库(C++ Standard Template Library)全面介绍

STL 是 C++ 开发者的 “效率神器”,其核心价值在于 “标准化的通用数据结构 + 算法”,让开发者无需重复造轮子,同时保证代码效率和可维护性。无论是基础编程、算法竞赛,还是工程开发(如服务器、游戏、嵌入式),STL 都是必备工具,掌握其核心容器、算法和使用场景,能极大提升 C++ 编程能力。

2501_94233638的博客 1290

C++ (Standard Template Library - STL) map 容器

C++ (Standard Template Library - STL) map 容器 序列容器是管理数据的宝贵工具,序列容器不提供方便的数据访问机制。map 容器提供了一种有效的存储和访问数据的方法。 map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。名称通常可能是一个或多个字符串。关联容器中的对象位置的确定取决于容器中的键的类型,而且对于特定容器类型的内部组织方式,不同的

程永强 555
上一篇: 【win32多线程】使用C++编写多线程
下一篇: 字典与散列表
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值