首页
学习
活动
专区
圈层
工具
发布

《C++初阶之STL》【泛型编程 + STL简介】

为什么要引入泛型编程? 请小伙伴们试想一下下面的这种场景: 假设你正在负责一个大型项目,其中需要实现三种不同类型变量的交换功能:整数、浮点数和字符的交换功能。...在 C++ 中,模板作为实现泛型编程的核心机制,依据其作用对象的不同,可清晰地划分为以下两种主要类型: 1.1 什么是函数模板?...类模板(Class Template):用于创建通用类,将数据类型作为类的参数,使类可以适配不同类型的数据。...: T* _array; // 指向存储栈元素的动态数组指针 size_t _capacity; // 栈的总容量 size_t _size; // 栈当前存储的元素个数...高移植性与跨平台:可在不同操作系统和编译器环境下使用,具有良好的兼容性。 同样的,上面的这几点也是为什么我们要学习使用STL的原因。 STL的六大核心组件是什么?

22210

C++教程(凯格尔训练法教程)

8 数组 8.1一维数组 8.2二维数组 8.3 指向数组的指针 8.4 数组与new(动态创建数组) 8.5 数组与函数 数组->函数 函数返回数组 8.6 获取数组的大小 9 函数 9.1 函数声明与定义...p+n运算得到的地址是p+n*sizeof(数据类型)。 两个相同数据类型的指针可以进行加减运算,一般用于数组的操作中。 关系运算:指针指向同一串连续存储单元才有意义,比如数组。...指针访问二维数组:指向二维数组元素,指向一维数组 数组指针:数据类型 (*指针变量名) [m] int arr[10]; int *p1 = arr;// *p1 = &arr[0]; int a[3...: *不是算子的一部分,星号表示在没有使用任何算子的情况下,就等效于使用了该算子,例如,在默认情况下,整数是用十进制形式输出的,等效于使用了 dec 算子 流操纵算子 作 用 *dec 以十进制形式输出整数...C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。按照定义方式分为以下四种。

3.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++教程(最全)「建议收藏」

    8 数组 8.1一维数组 8.2二维数组 8.3 指向数组的指针 8.4 数组与new(动态创建数组) 8.5 数组与函数 数组->函数 函数返回数组 8.6 获取数组的大小 9 函数 9.1 函数声明与定义...p+n运算得到的地址是p+n*sizeof(数据类型)。 两个相同数据类型的指针可以进行加减运算,一般用于数组的操作中。 关系运算:指针指向同一串连续存储单元才有意义,比如数组。...指针访问二维数组:指向二维数组元素,指向一维数组 数组指针:数据类型 (*指针变量名) [m] int arr[10]; int *p1 = arr;// *p1 = &arr[0]; int a[3...: *不是算子的一部分,星号表示在没有使用任何算子的情况下,就等效于使用了该算子,例如,在默认情况下,整数是用十进制形式输出的,等效于使用了 dec 算子 流操纵算子 作 用 *dec 以十进制形式输出整数...C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。按照定义方式分为以下四种。

    3.1K31

    C++初阶:初识STL、String类接口详细讲解(万字解析)

    仿函数(Functors):仿函数是一种类对象,它重载了函数调用操作符(),使得可以像函数一样调用这个类对象。STL中的很多算法都可以接受仿函数作为参数,以实现更加灵活的功能。...,再添加了一些专门用来操作string的常规操作 实际上,std::string 是 C++ 标准库中的一部分,而 STL(标准模板库)是 C++ 标准库的子集,但是由于它和其他 STL 容器(如...(最推荐使用) 在 C++ 标准库中,std::string 类提供了迭代器,用于遍历字符串中的字符。...反向迭代器允许从容器的末尾向前遍历容器中的元素。 rend 函数返回一个反向迭代器,指向容器中第一个元素之前的位置。通常用于标记反向遍历的结束位置。...npos 的类型是 size_t,它是一个无符号整数类型 8.String operations函数(find,rfind,substr) 8.1find find 用于返回 一个字符或一个字符数组或一个

    57910

    C qsort 与 C++ sort 函数

    num 数组中待排序元素数量。 size 各元素的占用空间大小。 compar 指向函数的指针,根据返回值确定排序的顺序 。...+ 标准模板库(STL)中的函数模板,定义于头文件,所在名字空间为 std。...qsort 是 C 的库函数,sort 是 C++ STL 中的函数模板。 sort 更易于使用。 qsort 必须要指定比较函数,而 sort 可以指定,也可以缺省。 sort 速度更快。...而 qsort() 通过函数指针进行间接调用比较元素大小,导致编译器无法优化。 sort 灵活性更高。...sort 适用于所有数据类型和不同的数据容器,例如 C 数组、C++ 向量、C++ 双端队列等以及用户可以编写的其他容器。 这种灵活性在 C 语言中很难实现。 sort 安全性更高。

    1K10

    【C++】size_t全面解析与深入拓展

    前言 在C++的开发过程中,我们经常会遇到一个数据类型——size_t。它看似普通,但在实际使用中却扮演着非常重要的角色。...很多人刚接触时会有疑惑:size_t和普通的无符号整型(unsigned int)有什么关系和区别?为什么在很多地方偏偏要用size_t而不是其他整数类型?...size_t 是一种无符号整数类型,其主要用途是表示对象大小(比如内存大小、数组索引等),它在C++标准库中被广泛使用,比如sizeof返回值、STL容器的.size()方法、动态内存分配函数的参数等等...在32位系统上,它通常是4字节的无符号整数;而在64位系统上,它通常是8字节的无符号整数。 为什么需要size_t? 设计size_t的核心目的是为了跨平台的适应性。...作为C++中的一种无符号整数类型,具有独特的意义和重要性。

    2K10

    09.string类的常用接口讲解

    这是由于string比STL出现的还要早一些,在STL之后统一给出了size() 早期的 C++字符串处理库可能没有一个统一的标准,不同的实现中可能存在不同的函数来获取字符串长度。...这个固定大小的缓冲区可能会因不同编译器的差异而有所不同,不过通常是在15~20,由于我们这使用的是vs编译器,所以固定大小是15 可以看到vs的底层实现是用一个固定大小的数组_Buf,数组大小是16,由于要存放...一、与 C 语言接口交互 很多 C 语言的函数和库只接受以空字符结尾的字符数组(C 风格字符串)作为参数。例如,标准 C 库中的 printf 函数、文件操作函数等。...二、提供底层字符串表示 它返回一个指向以空字符结尾的字符数组的指针,这个指针指向的内容与 std::string 对象中的内容是一致的。...表示最大的 size_t 值: size_t 是一个无符号整数类型,用于表示字符串的长度、索引等。 string::npos 的值通常被设置为 size_t 类型所能表示的最大值。

    16810

    【C++之STL】一文学会使用 string

    扩充STL不是任何人可以直接传授的道理,而是一种慢慢沉淀出来的经验,作为初学者,不要盲目地尝试,因为那大概率只是浪费时间。...指针 s 指向的是一个字符串,无论是常量字符串还是字符数组,都必须以'\0'结尾才能保证正常构造。...auto不能作为函数的参数,可以做返回值,但是建议谨慎使用 。...2. 11 字符串操作 c_str() (重要) 返回一个指向数组的指针,该数组包含以 null 结尾(即’\0’)的字符序列(即 C 字符串),表示 string 对象的当前值。...这个函数用于用于兼容一些string类没有实现的字符串的用法。 注意这个指针可能会在string对象调用一些接口后失效(如扩容)。

    50410

    《C++进阶之STL》【哈希表】

    (它可以是整数、字符串等各种数据类型对于非整数类型,通常需要先通过其他方式将其转换为整数) A:是一个常数。...四、冲突处理 方法一:开放定址法 开放定址法(Open Addressing):开放定址法是处理哈希冲突的一种系统化方法,所有元素都存储在哈希表数组本身中(而不是像链地址法那样使用额外的数据结),通过探测序列寻找可用的空槽位...通过上面的学习我们知道了使用哈希函数要把关键字映射到数组的对应位置上,通常来说,关键字是整数的话进行映射计算会更方便。...>=n 的素数 //3.1:使用一个指针指向素数表中的“第一个素数” const unsigned long* first = _stl_prime_list; //3.1:使用一个指针指向素数表中的...>=n 的素数 //3.1:使用一个指针指向素数表中的“第一个素数” const unsigned long* first = _stl_prime_list; //3.1:使用一个指针指向素数表中的

    21910

    C++进阶:(十一)深度解析——用哈希表封装 unordered_map 和 unordered_set

    前言 在 C++ 的 STL 容器家族中,unordered_map 和 unordered_set 是高频使用的关联式容器。...因此,在我们自己的实现中,会采用更清晰的命名规则:用 K 表示 key 类型,V 表示 value 类型,T 表示哈希表中存储的实际数据类型(可能是 K,也可能是 pair)。...这里采用经典的字符串哈希算法: // HashTable.h // 字符串类型的哈希函数特化 template struct HashFunc { size_t operator...const HashTable* _pht; // 指向哈希表的指针(用于查找下一个桶) // 构造函数 HTIterator...而质数的因子较少,能让 key 更均匀地分布在各个桶中,减少冲突。 5.2 优化方向 5.2.1 支持更多 key 类型 目前我们的哈希函数只支持 int 和 string 类型。

    17910

    《C++初阶之STL》【模板参数 + 模板特化 + 分离编译】

    ):表示模板中使用的 常量值 通常为整型、枚举值或指针/引用 C++11 后支持 std::nullptr_t、constexpr 变量等 1....为什么要使用模板特化? 在介绍的模板特化的时候,我们说模板特化是多么的厉害,但是口说无凭,模板特化真的有那么好吗? 下面的我们就来看一看模板特化的重要性。...= &d2; // p2 指向 d2 的内存地址 cout << Less(p1, p2) << endl; //注意:调用特化之后的版本了,而不是走通用模板了 return 0; }...示例:让 max_val 对指针类型,比较指针指向的值,而非指针地址,通过重载实现:指针类型的 “偏特化” #include using namespace std; // 通用函数模板...回顾与总结: Less 函数在比较 p1 和 p2(指针)时,内部没有比较它们指向对象的实际内容,而是直接比较了指针的地址,这与我们想要比较对象内容的预期不符,会引发错误。

    20610

    深入探索 C++ 模板进阶与应用

    非类型模板参数是一种在编译期就能够确定的常量,其可以是整数、指针或引用等,但不允许是浮点数、类对象或者字符串。使用非类型模板参数可以实现更灵活的模板设计。...例如,我们可以用一个常量作为类模板的参数,来定义具有固定大小的数组类: #include namespace bite { templatesize_t...2.1 函数模板特化 函数模板特化用于在基础模板的基础上,为某些特殊类型提供专门的实现。例如,我们在实现一个比较函数 Less 时,对指针类型进行特化,以正确比较指针所指向的内容而非指针地址。...这样一来,我们便可以对某些特定组合类型提供特殊处理。 3. 模板的分离编译 3.1 概念 在大型项目中,通常会将类和函数的声明与定义分离,放到不同的文件中。...灵活性:模板提高了代码的灵活性,使得代码能够处理更多的数据类型,而不需要为每种类型重复编写相似代码。

    49310

    【c++】STL-string容器的使用

    这次带来的是C++中关于STL-string容器的使用这部分的一些知识点,如果对你有所帮助的话,可否留下你的三连呢?...1.3 STL的六大组件 容器:用于存储和管理数据的类模板。 算法:一系列用于处理容器中元素的函数模板。 迭代器:与指针类似,用于遍历容器中的元素,是容器与算法之间沟通的桥梁。...当此值用作 string 成员函数中的 len(长度参数) 时,表示直至这个字符串的末尾。 作为返回值,它通常用于表示未找到匹配项。...2.8 字符串操作相关成员函数 1. c_str(): 返回一个指向数组的指针,该数组包含一个以’\0’结尾的字符序列,即c字符串。...c_str()可以拿到底层的_str(内部指针),即指向c风格字符串的指针。 有些函数只提供c的接口(比如 fopen()等),而没有c++的接口,这种情况下,c_str()可以很好的解决这个问题。

    16810

    C++ STL string类全面指南:从编码历史到实战应用

    GCC通常被视为G++的统称,而G++是GCC中用于C++编译的组件。SGI版本的可移植性和可读性高,成为学习STL源代码的重要参考。...,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数 五、标准库中的string类 5.1 string类的历史地位与STL关系 在使用string类时,必须包含#include...operator[ ]是个运算符重载 相关功能介绍 参数的说明,返回值的说明 样例:展示每一个接口 5.8.1 string的成员函数 注意,存常量字符串不是存一个指针指向的数组...begin的函数提供的,begin是提供开始位置的迭代器 还有一个指针end,这是最后一个字符的下一个位置,就是指向’\0’位置的指针,指向有效位置的下一个位置,'\0’不算有效字符,而是一个标识字符...=last,而不是first数组,后面的值一定大于前面的值,而链表中的节点是没有大小关系的 设计成左闭右开区间还有一个目的,若找到了就返回对应位置的迭代器(解引用就可以取到该位置的值

    15510

    C++效率掌握之STL库:string函数全解

    STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发 1.为什么要学习string?什么是string?...:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作 2.string类对象的常见构造 string作为一个类也有构造函数...string类对象 string (const string& str) 拷贝构造函数 string (const char* s, size_t n) 从 s 指向的字符数组中复制前 n 个字符 string...string 的元素访问提供了能够像数组那样自由访问字符串中的数组的函数,极大的提高了字符修改的效率 值得注意的是: at 用于访问指定位置元素的成员函数。...返回 C 格式字符串 data 返回一个指向字符串内部字符数组的指针 get_allocator 获取容器当前使用的分配器实例 copy 将字符串的一部分复制到一个字符数组中 find 在字符串中查找子字符串或字符第一次出现的位置

    96910

    探索信息学奥赛中的C++编程技巧与应用

    数组作为数据的集合,是解决许多问题的基石。字符串处理是很多竞赛题目的重要一环。栈和队列则常用于解决需要维护顺序的问题。 在第四部分,我们将关注常用算法,如排序算法和查找算法。...此外,我们还将强调编写清晰易读的代码的重要性,以便在竞赛中更快地理解和调试代码。 2.1 变量和数据类型 在C++中,变量用于存储数据,并且在使用之前需要声明和定义。...以下是一些常见的C++数据类型: 整数类型: int、long、short 等,用于存储整数值。 浮点数类型: float、double,用于存储带小数点的数值。...3.1 数组 数组是存储相同类型数据的集合,能够通过索引访问其中的元素。在信息学竞赛中,数组常常用于存储序列数据,如整数序列、字符序列等。 创建数组: 使用[]操作符声明数组,并指定数组的大小。...引用通常用于函数参数传递和避免拷贝大对象。

    1.3K40

    【C++基础篇】学习C++就看这篇--->内存管理之new和delete

    本质不同 sizeof: 是编译时运算符(不是函数),在编译期间确定结果。 功能:计算变量或数据类型所占内存的字节数(包括字符串末尾的 \0)。...) 返回指针指向字符串的长度 二、C++内存管理方式 ✨2.1 C语言内存管理方式(回顾) C语言当中我们知道malloc/calloc/realloc/free,在此进行回顾下: 特性 malloc...] 相信会有这样的疑惑,既然C++继承了C语言的用法,即默认malloc、calloc等函数是可以使用的,为什么还要new/delete这些呢?...size_t 是一个无符号整数类型,用于表示大小和索引等非负值。在 32 - bit 系统中,size_t 通常是 32 位无符号整数,其范围是 0 到 4294967295。...C语言通过malloc、calloc、realloc和free进行内存管理,而C++引入了new和delete操作符,适用于对象和数组的动态内存管理。

    29910

    SWIG 官方文档第二部分 - 机翻中文人肉修正

    您可以选择更具吸引力的选项,即在函数声明中使用double作为返回类型而不是result_of ! 8 预处理 SWIG 包括其自己的 C 预处理器的增强版本。...没有任何类型的边界检查或安全性。如果你想要这个,你应该考虑使用一个特殊的数组对象而不是一个裸指针。...这些类型映射覆盖默认类型映射,以便存储底层代理类并将其作为指向 shared_ptr 的指针传递而不是指向基础类型的普通指针。...%shared_ptr 宏引入的唯一真正变化是代理类存储了一个指向 shared_ptr 实例的指针,而不是一个指向该实例的原始指针。...因此,您不能像本示例中的底层 C 函数那样就地修改对象的值。因此, INOUT 规则将修改后的值作为新对象返回,而不是直接覆盖原始输入对象的值。

    3.2K20

    【哈希表】—— 我与C++的不解之缘(二十八)

    其实这种方法之前就是用过:字符串中的第一个唯一字符 对于上面只一道题,我们做法就是开辟一个26大小的字符数组,然后遍历数组统计每个字符出现的次数;最后遍历字符串,看哪一个字符最先只出现了一次。...这里也不是说非得要这样,就比如java中的HashMap就是采用2的整数次幂作为哈希表的大小;但是它并不是单纯的取模,假设M是2^16,本质上是取16位:key' = key>>16,然后将key和key...这里,只能说像理论那样说,尽量不要取2的整数次幂、10的整数次幂;但是呢,在实践中我们要灵活应用,而不是死记这些。...关键字key转化成整型问题 我们将关键字映射到数组中位置,一般都是整数好做计算,不是整数也是那个通过强制类型转换变成整型的数据 在uordered_set第二个模版参数和unordered_map的第三个模版参数...编译器会自动调用vector的析构函数,但是链地址法内存放的是指针,需要我们自己去释放指针指向的空间,所以我们要自己写析构函数。

    27210

    抽象之诗:C++模板的灵魂与边界

    在传统的程序设计中,我们常常为不同的数据类型书写类似的代码,而模板以一种优雅的方式将类型抽象化,使逻辑可以跨越不同的类型。...2.2 注意事项 允许的类型:非类型模板参数可以是整型、枚举、指针或者引用类型,但浮点数、类对象和字符串不允许作为非类型模板参数。 编译期确认:非类型模板参数必须在编译期确认。...,比较指针指向的内容 return 0; } 在这个例子中,函数 Less 针对 Date* 指针类型进行了特化,以正确处理指针类型的比较。...} 通过类模板特化,可以实现对指针的排序,并确保比较的是指针指向的内容而不是地址。...在 CheckType 函数模板中,当传入的参数是整数类型时,编译器选择第一个版本,而当参数是浮点数类型时,选择第二个版本。 九.

    21610
    领券