![](https://img-blog.csdnimg.cn/20191021103147836.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
STL
系统性的整理stl
小哈龙
一颗勇往直前的心
展开
-
c++多线程中detach的使用隐患
一、其他构造线程的方法c++线程,除了可以利用普通函数创建线程外,还有其他创建线程的方法:类对象 Lambda表达式具体使用方法如下:#include <thread>using namespace std;class TA{public: void operator ()() { printf("%s", "线程开始执行 \n"); }};void main(){ TA ta; // thread 方法会调用TA的拷贝构造函数,所以使用det转载 2020-08-19 14:23:54 · 2323 阅读 · 3 评论 -
C++11多线程join()和detach()
简介每一个程序至少拥有一个线程,那就是执行main()函数的主线程,而多线程则是出现两个或两个以上的线程并行运行,即主线程和子线程在同一时间段同时运行。而在这个过程中会出现几种情况:主线程先运行结束 子线程先运行结束 主子线程同时结束在一些情况下需要在子线程结束后主线程才能结束,而一些情况则不需要等待,但需注意一点,并不是主线程结束了其他子线程就立即停止,其他子线程会进入后台运行join()join()函数是一个等待线程完成函数,主线程需要等待子线程运行结束了才可以结束#incl转载 2020-08-19 14:06:25 · 1799 阅读 · 0 评论 -
std::thread
本文转载自:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Introduction-to-Thread.md本节将详细介绍std::thread的用法。std::thread在<thread>头文件中声明,因此使用std::thread需包含<thread>头文件。<thread>头文件摘要<...转载 2020-08-19 11:59:36 · 1401 阅读 · 0 评论 -
为什么不能cout一个string?
为什么不能cout一个string#include<iostream>int main(int, char**){ std::string str("hello"); // 正确 std::cout << str << std::endl; // 错误,没有与这些操作数(operand,std::string)相匹配的"<<"运算符 return 0;}cout竟然不能输出string类型,这太令人诧异了?...转载 2020-07-05 22:29:04 · 1247 阅读 · 0 评论 -
abort()和exit()的区别
原文链接:https://blog.csdn.net/youshaoduo/article/details/53691054exit和abort都是用来终止程序的函数,他们的不同如下:exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序。如果有函数通过atexit来注册,还会调用注册的函数。不过,如果atexit函数扔出异常的话,就会直接调用结束。...转载 2020-04-08 10:38:55 · 3324 阅读 · 0 评论 -
STL中常用容器的数据结构与底层实现
关于几种数据结构:vector(向量):STL中标准而安全的数组。只可以在vector的“前面”增加数据。deque(双端队列double-ended queue):在功能上与vector相类似,但是可以在前后端向其中添加数据。list(列表):游标以此只可以移动一步。如果对链表链表已经很熟悉,那么STL中的list其实就是一个双向链表(每个节点有指向前驱和指向后继的两个指...转载 2020-03-31 12:13:08 · 997 阅读 · 0 评论 -
C++ STL sort 函数的用法(自定义排序函数)
sort 在 STL 库中是排序函数,有时冒泡、选择等O(n2)O(n2)算法会超时时,我们可以使用 STL 中的快速排序函数O(nlogn)O(nlogn)完成排序sort 在 algorithm 库里面,原型如下:template <class RandomAccessIterator> void sort ( RandomAccessIterator ...原创 2020-03-30 13:57:51 · 5629 阅读 · 0 评论 -
C++:使用vector::reserve来避免不必要的重新分配
关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。这个类似于realloc的操作有四个部分:分配新的内存块,它有容器目前容量的倍数。在大部分实现中,vector和string的容...转载 2020-03-13 18:08:18 · 313 阅读 · 0 评论 -
标准c++读写ini文件类
本类是在网络上的一个标准ini读写类修改扩展而来,新增了获取当前可执行文件路径,宽字节转多字节功能IniFileSTL.h:#ifndef _FISH_INI_FILE_#define _FISH_INI_FILE_#include <string>#include <vector>namespace fish{ using namespace s...原创 2019-12-05 12:21:19 · 2337 阅读 · 0 评论 -
流迭代器实现文件操作(读取和写入)
流迭代器并不知道底层流的特性。当然,它们只适用于文本模式,否则它们不会关心数据是什么。流迭代器可以以文本模式来读写任何类型的流。这意味着除了其他的一些流之外,我们可以用迭代器以文本模式来读和写文件。在深入讲解如何对文件使用流迭代器之前,需要提醒你文件流的一些本质特征以及如何生成一个封装了文件的流对象。文件流文件流封装了一个实际的文件。文件流有长度,也就是这个流中字符的个数,因此对于新的输出...转载 2019-11-27 16:23:56 · 1041 阅读 · 0 评论 -
c++ STL输入流迭代器
输入流迭代器是一个可以在文本模式下从流中提取数据的输入迭代器,这意味着不能用它处理二进制流。一般用两个流迭代器来从流中读取全部的值:指向要读入的第一个值的开始迭代器,指向流的末尾的结束迭代器。在输入流的文件结束状态(End-Of-File,EOF)被识别时,就可以确定结束迭代器。定义在 iterator 头文件中的 istream_iterator 模板会用提取运算符 >> 从流中...转载 2019-11-15 15:54:22 · 750 阅读 · 0 评论 -
C++随机数生成器(default_random_engine)
默认随机数生成器是 std::default_random_engine 类型别名定义的随机无符号整数的通用源。这个别名表示实现是被定义的,选择的模板类型参数需要能够为用户提供他们满意的序列。下面是一种生成 default_random_engine 类型的迭代器的简单方式:std::default_random_engine rngl; // Create random number ge...转载 2019-11-12 16:10:22 · 6848 阅读 · 0 评论 -
C++ 随机数生成
在随机数生成方面STL有 4 个术语:随机数生成引擎是一个定义了生成随机位序列的无符号整数序列机制的类模板。STL定义了3个代表随机数引擎的类模板。本章的后面会对它们进行简短的介绍,但除非你对它们所使用的算法已经有深入的了解,否则不要直接使用它们,而应该使用随机数生成器。 随机数生成器是随机数引擎类模板的一个预定义的实例。每一个生成器都会将一套具体的模板参数应用到随机数引擎的类模板上,因...转载 2019-11-12 16:01:41 · 4580 阅读 · 0 评论 -
STL中的所有算法(70个)
STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。 STL中算法大致分为四类: 1、非...转载 2019-11-12 12:22:55 · 357 阅读 · 0 评论 -
C++ unordered_map初始化
生成 unordered_map 容器和生成 map 一样简单,只要可以用 hash<K> 的实例哈希 k 类型的键,而且必须能够用 == 运算符来比较键。下面展示了如何定义和初始化 unordered_map:std::unordered_map<std::string, size_t> people {{"Jan",44}, {"Jim", 33}, {"Joe"...转载 2019-11-08 16:11:23 · 9105 阅读 · 0 评论 -
C++ hash(STL hash)及其函数模板用法详解
如果在容器中保存对象及其关联的键,并且不用键来决定键/对象对的顺序,那就必须对键值釆用其他方式来确定元素在内存中的位置。如果使用像 string 这样的对象作为键,就会遇到一些问题,可能的变量的数目是巨大的。具有 10 个字符的字母字符串可能的个数是 2610。这个索引范围没有多大用处。我们需要一种机制来将它变为可接受的范围;而且理想情况下,这个机制可以为每个键生成唯一的值。这也是哈希需要做的...转载 2019-11-08 15:33:55 · 7439 阅读 · 0 评论 -
泛型指针,原生指针和智能指针
1. 泛型指针泛型指针有多种含义。(1) 指void*指针,可以指向任意数据类型,因此具有“泛型”含义。(2) 指具有指针特性的泛型数据结构,包含泛型的迭代器、智能指针等。广义的迭代器是一种不透明指针,能够实现遍历访问操作。通常所说的迭代器是指狭义的迭代器,即基于C++的STL中基于泛型的iterator_traits实现的类的实例。总体来说,泛型指针和迭代器是两个不同的概念,其中的交...转载 2019-11-07 16:47:26 · 503 阅读 · 0 评论 -
[c++11]我理解的右值引用、移动语义和完美转发
c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。左值、右值C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如...转载 2019-11-04 17:51:37 · 352 阅读 · 1 评论 -
C++的multi_map如何输出所有key值相等的元素
在multimap中,同一个键关联的元素必然相邻存放。基于这个事实,就可以将某个键对应的值一一输出。1、使用find和count函数。count函数求出某个键出现的次数,find函数返回一个迭代器,指向第一个拥有正在查找的键的实例。2、使用lower_bound(key)和upper_bound(key)lower_bound(key)返回一个迭代器,指向键不小于key的第...转载 2019-11-01 09:32:22 · 1491 阅读 · 2 评论 -
C++序列容器存储智能指针
通常用容器保存指针比保存对象更好,而且大多数时候,保存智能指针比原生指针好。下面是一些原因:在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。 在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。当要处理有共同基类的任意对象序列时,这种功能是非常有用的。应用这一特性的一个常见示例是展示一个含有直线、曲线和几何形状的对象序列。 对指针容...转载 2019-10-30 18:41:06 · 1827 阅读 · 0 评论 -
C++堆
堆(heaps)不是容器,而是一种特别的数据组织方式。堆一般用来保存序列容器。堆很重要,很多不同的计算机进程中都使用了它们。为了弄明白堆是什么,首先需要明白树是什么,因此首先说明树这种数据结构是什么。树是分层排列的元素或节点。每个节点有一个键,它是节点中所保存的对象,就如同链表中的节点。父节点是有一个或两个子节点的节点。一般父节点可以有任意个数的子节点,树中的父节点不需要有相同个数的子节点。没...转载 2019-10-30 18:24:06 · 2736 阅读 · 0 评论 -
字符串比较原理(strcmp,string)
字符串比较分为两种情况,一种是单个字符比较大小,一种是多个字符构成的字符串整体比较大小。字符与字符串比较原理:字符串与字符比较原理其实都是比较单个字符的ASCII码值。如果单纯比较长度,直接调用类似于strlen()之类的函数就可以,加以比较即可. 如果比较字符串的大小,则比较的是字符的ASCII编码的大小.你搜索一下ASCII码表就可以得知每一个ASCII字符的大小.在比较字符串...原创 2019-10-29 11:15:10 · 44419 阅读 · 1 评论 -
C++ priority_queue
priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理。但是如何定义“优先级”完全取决于我们自己。如果一个优先级队列记录的是医院里等待接受急救的病人,那么病人病情的严重性就是优先级。如果队列元素是银行的借贷业务,那么借记可能会优先于信贷。priority_queue ...转载 2019-10-28 18:09:57 · 385 阅读 · 0 评论 -
C++ queue(STL queue)
只能访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列。对于任何需要用 FIFO 准则处理的序列来说,使用 queue 容器适配器都是好的选择。图 1 展示了一个 queue 容器及其一些基本操作:图 1 q...转载 2019-10-28 17:29:52 · 1289 阅读 · 0 评论 -
C++ stack(STL stack)
容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。stack<T>容器适配器中的数据是以 LIFO (后进先出)的方式组织的,这和自助餐馆中堆叠的盘子、箱子中的一堆书类似。图 1 展示了一个理论上的 stack 容器及其一些基本操作。只能访问 stack 顶部的元素;只有在移除 ...转载 2019-10-28 16:21:35 · 1162 阅读 · 0 评论 -
list和forward_list
list容器list是双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。list的特点不支持随机访问; 在任何位置插入或删除非常迅速;list的初始化和成员函数有关其他函数的应用,可以参考下面的连接,很详细。list成员函数的使用。forward_list 容器forward_list是一个...转载 2019-10-25 15:07:48 · 1092 阅读 · 0 评论 -
c++ 11 中for循环新增的用法(基于范围的for循环)
for循环在c++中很常见,在c++11中新增了for的用法,我也是在最近看代码的时候遇见的,在for循环新增的功能中也涉及到了c++11新增的auto,可以自动获取变量类型。以前的用法:for(表达式1;表达式2;表达式3){ //循环的内容}c++11中的用法:for 语句允许简单的范围迭代:int my_array[5] = {1, 2, 3, 4, 5}...原创 2019-10-25 14:49:29 · 1225 阅读 · 0 评论 -
C++11中using 的使用
前言:今天在看vector.h的时候,碰到一个using的奇怪用法,才疏学浅之前没有碰到过,整理一下。来看下source code:template<class _Ty, class _Alloc = allocator<_Ty>> class vector : public _Vector_alloc<_Vec_base...转载 2019-10-24 11:56:29 · 1859 阅读 · 0 评论 -
string和string.h以及cstring的区别
在C++中,#include<iostream>与#include<iostream.h>的区别,前者要使用更新的编译器(其实大部分编译器多比较前卫了,除了有些搞嵌入式的用变态的编译器),后者在有些VS版本中已经不再支持了原来iostream是C++的头文件,iostream.h是C的头文件,即标准的C++头文件没有.h扩展名,将以前的C的头文件转化为C++的头文件后,...转载 2019-10-24 11:10:48 · 3129 阅读 · 1 评论 -
C++序列式容器(STL序列式容器)
序列容器以线性序列的方式存储元素。它没有对元素进行排序,元素的顺序和存储它们的顺序相同。以下有5种标准的序列容器,每种容器都具有不同的特性:array<T,N>(数组容器)是一个长度固定的序列,有 N 个 T 类型的对象,不能增加或删除元素。 vector<T>(向量容器)是一个长度可变的序列,用来存放 T 类型的对象。必要时,可以自动增加容量,但只能在序列的末尾高效...转载 2019-10-24 10:24:46 · 576 阅读 · 0 评论 -
STL之仿函数实现详解
1、何为仿函数仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载...转载 2019-10-23 17:29:42 · 618 阅读 · 0 评论 -
C++字符串查找函数
在 C 语言和C++语言中,可用于实现字符串查找功能的函数非常多。在STL中,字符串的查找功能可以实现多种功能,比如说:搜索单个字符、搜索子串; 实现前向搜索、后向搜索; 分别实现搜索第一个和最后一个满足条件的字符(或子串);若查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos...转载 2019-10-23 17:05:54 · 2600 阅读 · 0 评论 -
C++字符串输入输出操作
"<<" 和 ">>" 提供了C++语言的字符串输入和字符串输出功能。"<<" 可以将字符读入一个流中(例如 ostream);">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。还有一个常用的 getline() 函数,该函数的原型包括两种形式:template &l...转载 2019-10-23 16:55:43 · 2515 阅读 · 0 评论 -
C++ string字符串修改和替换方法
字符串内容的变化包括修改和替换两种。本节将分别讲解字符串内容的修改和字符串内容的替换。字符串内容的修改可以通过使用多个函数修改字符串的值。例如assign(),operator=,erase(),交换(swap),插入(insert)等。另外,还可通过append()函数添加字符。下面逐一介绍各成员函数的使用方法。assign()函数使用 assign() 函数可以直接给字...转载 2019-10-23 16:49:41 · 10660 阅读 · 0 评论 -
C++ string获取字符串元素:[]和at()
在通常情况下,string 是C++中的字符串。字符串是一种特殊类型的容器,专门用来操作字符序列。字符串中元素的访问是允许的,一般可使用两种方法访问字符串中的单一字符:下标操作符[]和成员函数at()。两者均返回指定的下标位置的字符。第 1 个字符索引(下标)为 0,最后的字符索引为 length()-1。需要注意的是,这两种访问方法是有区别的:下标操作符 [] 在使用时不检查索引...转载 2019-10-23 16:31:26 · 3193 阅读 · 0 评论 -
C++ string构造函数和析构函数
构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 string 类型对象,也可以使用 C 风格字符串的部分或 string 类型对象的部分或序列。注意,不能使用字符或者整数去初始化字符串。常见的 string 类构造函数有以下几种形式:string strs //生成空字符串string s(str) //生成字符串str的复制品s...转载 2019-10-23 16:29:34 · 1081 阅读 · 0 评论 -
C++ string类成员函数
在定义 string 类对象时,string 类自身可以管理内存,程序员不必关注内存的分配细节。string 类提供的各种操作函数大致分为八类:构造器和析构器、大小和容量、元素存取、字 符串比较、字符串修改、字符串接合、I/O 操作以及搜索和查找。下表列出了 string 类的所有成员函数及它们的功能。表 1 string 类的所有成员函数 函数名称 功能 构造函数 ...转载 2019-10-23 16:28:14 · 294 阅读 · 0 评论 -
C++basic_string(字符串类模板)
"字符" 本身是个有趣的抽象概念。例如,在纸上或者屏幕上,字符 "C" 仅仅是一段曲线而已。在计算机中,用一个 8 Byte 存储该字符,并赋值 67;字符 "C" 还是拉丁字母的第三个字母;在化学专业,字符 "C" 是原子碳的缩写形式;在计算机学科中,字符 "C" 又被用来表示一种程序设计语言的名字。目前,在计算机领域,字符集合是在字符与整数值之间的一种映射关系。C++程序员通常假定能够...转载 2019-10-23 16:25:59 · 1221 阅读 · 0 评论 -
string和wstring相互转换以及wstring显示中文问题
如果你只是使用C++来处理字符串,会用到string。不过string是窄字符串ASCII,而很多Windows API函数用的是宽字符Unicode。这样让string难以应对。作为中国的程序员,我们第一个想到的字符串就是中文,而不是英文。所以经常会遇到中文字符问题,需要经常在ASCII字符串和Unicode字符串转换。而C++的string并么有很好的去支持这么一个转换,所以还需要我们自己去写...转载 2019-10-22 15:13:55 · 6613 阅读 · 1 评论 -
stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用
1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:void Function(){Obj*p = new Obj(20);...if (error occor)throw ... 或者 retrun;delete p;}在函数遇到错误之后,一般会抛异常,或者返回,但是这时很可能遗漏之前申请的资源,及时是很有经验的程序员也有可能出现这种...转载 2019-10-21 16:59:36 · 518 阅读 · 0 评论