STL
一缕阳光a
(1)、从2018年8月开始从事分布式数据库内核开发工作,包括自研分布式分析型数据库OLAP、自研分布式数据库HTAP,根据开源数据库实现本公司集群型的OLTP产品,以及现在正在做的根据opengaussDB开发的HTAP类型数据库。
(2)、乐于专研,对分布式数据库有强烈的兴趣。
个人邮箱: zgaoq@163.com。
展开
-
STL中的set/map
std::set/std::map底层实现的机制是红黑树,树中的数据是有序的,那么进行插入、删除、查找时的平均时间复杂读O(logN),以2为低的对数N。set相当于map中的key,map中的key不能有重复的并且按升序进行排序,如果结构体作为map中的key,需要重写小于函数实现排序的功能。std::unordered_set<T>和std::unordered_map<T, T>底层实现方式是哈希表,其中的数据是无序的。查找时效率高,没有hash冲突情况下时间复杂度是O原创 2022-04-18 19:35:57 · 1161 阅读 · 0 评论 -
std::map中的lower_bound与upper_bound
最近在工作中遇到了std::map中的lower_bound与upper_bound,再次记录下其功能和使用方式。std::map<char, int> mp;mp.lower_bound<key> : 返回的是小于、等于key的iterator,如果没有则返回第一个元素的iterator。mp.upper_bound<key> :返回的是大于key的iterator,如果没有,则返回空例子如下:// map::lower_bound/upper原创 2022-04-18 13:57:23 · 2854 阅读 · 0 评论 -
std::string中的find_first_of()和find_last_of()函数
编程语言: c++/linux在std::string中,有时需要找到一个string中最后一个或者第一个以某个特定的字符开始的位置或者下标,这时就需要使用find_first_of()和find_last_of()函数。find_first_of() : 找到一个string中第一个以 某个 字符开始的位置find_last_of() :找到一个string中最后一个以 某个 字符开始的位置使用方式如下:#include <iostream>#include <s原创 2022-03-16 18:53:05 · 4213 阅读 · 0 评论 -
std::make_shared<T>/std::make_unique<T>与std::shared_ptr<T>/std::unique_ptr<T>的区别与联系
(1)、std::make_shared<T>与std::make_unique<T>相对于std::shared_ptr<T>/std::unique_ptr<T>只有一次内存的分配(2)、std::make_shared<T>与std::make_unique<T>不会抛出异常;此外,std::make_shared<T>是在C++11中引入的;std::make_unique<T>在C++14中引入的原创 2021-09-18 17:36:10 · 241 阅读 · 0 评论 -
std::unique_ptr<T>与boost::scoped_ptr<T>的特殊性
std::unique_ptr<T>与boost::scoped_ptr<T>的底层实现原理类型,不清楚是谁"借鉴"另一个的实现的,但这不重要。std::unique_ptr<T>与boost::scoped_ptr<T> 都禁用了拷贝构造和赋值函数,所以不能作为STL容器中的元素,要作为STL容器中的元素时,那么进行push_back()时要调用赋值函数,但是他们都禁用了拷贝构造和赋值函数,所以不能作为STL容器中的元素。但是可以有另一种方法,使用s原创 2021-09-18 17:21:59 · 171 阅读 · 0 评论 -
std::make_unique<T>和std::make_shared<T>
std::make_shared是C++11的一部分,std::make_unique不是,它在C++14才纳入标准库。如果你使用的是C++11,不用忧伤,因为std::make_unique的简单版本很容易写出来: template<typename T, typename... Ts> std::unique_ptr<T> make_unique(Ts&&... params) { return std::unique.转载 2021-06-04 15:44:53 · 1948 阅读 · 0 评论 -
vector查找、插入、删除时效率对比
vector底层实现的机制时动态数组,因此适用于查找比较频繁的场景。那么在vector的中push_back()一个元素时或者在尾部删除一个元素时,效率是不是就高?结果:不是。无论在任何位置插入或者删除元素时,都会进行内存的分配与释放,对象的创建与销毁,所以只要进行插入、删除时,效率就会低。因此,vector适用于查找比较频繁的场景,插入和删除效率低。...原创 2021-04-15 18:44:23 · 1815 阅读 · 0 评论 -
vector内存扩容
vector底层实现的机制是一个动态数组,当其占用的内存不足时,就会自动分配时原来内存大小2倍的空间,并将原来内存中的数据拷贝到新开辟的内存中。vector扩容时,并不是在原有内存的基础上再分配一块内存,而是在其他的地方分配是原来内存大小2的空间,并将原来内存中的数据拷贝到新开辟的内存中,最后释放原来的内存。所以不会出现内存重叠的现象。...原创 2021-04-15 17:45:26 · 1055 阅读 · 0 评论 -
为什么auto_ptr智能指针不能作为STL标准容器的元素
上个星期的博客shared_ptr源码剖析里其实遗漏了一个问题:为什么auto_ptr不可以作为STL标准容器的元素,而shared_ptr可以? 我在网上看了好多篇讲shared_ptr的文章里讲到了这个问题,不过大多文章只是简单两笔带过。我研究了一下这个问题,发现还是有挺多有价值的内容,所以把这个问题单独成一篇博客和大家分享。先从表象上看看这个问题,假如有这样的一段代码,是否能够运行?int costa_foo(){ vector< auto_ptr<int>..转载 2020-08-25 19:14:40 · 502 阅读 · 0 评论 -
std::string中的反向迭代器rbegin()和rend()
在std::string中,有个接口是rbegin()和rend(),分别表示string字符串的倒数第一个字符和正数第一个字符;rbegin():表示string字符串的倒数第一个字符rend():表示string字符串的正数第一个字符分为普通的iterator和const iterator两种:reverse_iterator rbegin() noexcept;const_reverse_iterator rbegin() const noexcept;#include.原创 2020-06-16 14:30:59 · 4899 阅读 · 0 评论 -
boost::scoped_ptr与std::unique_ptr
boost::scoped_ptr与std::unique_ptr都是类模板,封装了指针两者都禁用了拷贝构造和赋值函数,因此不能作为STL容器中的元素,因为在执行push_back()时需要调用赋值函数。std::unique_ptr实际上与boost::scoped_ptr是等价的,只是std将boost::scoped_ptr拿来名字改为了std::unique_ptr,两者的实现方式是一致的。 boost::scoped_ptr源码如下:template<class T>.原创 2020-06-11 17:51:10 · 1373 阅读 · 0 评论 -
C++排序之stable_sort()的方法
stable_sort()可以对vector的某个成员进行排序,而且可保证相等元素的原本相对次序在排序后保持不变。下面是该函数的实现方法代码:#include <iostream>#include<math.h>#include <string>#include <vector>#include <iterator>#include <algorithm>using namespace std;typede..转载 2020-06-01 19:03:07 · 1684 阅读 · 0 评论 -
智能指针对比
智能指针对比:(1)、boost::shared_ptr<T> -- 基于引用计数器refcount(原子的)<1>、构造函数中refcount+1,析构函数中refcount-1,当refcount的值减到为0时,该对象就会被销毁。<2>、解决循环引用的问题:与weak_ptr<T>一起使用。weak_ptr<T>只引用不计数。...原创 2020-04-12 19:33:55 · 175 阅读 · 0 评论 -
对std::list<T>的封装
由于工作的原因,需要在线程安全的情况下对std::list<T>进行该list进行访问,因此就简单的封装了下,代码如下:template<typename T>class FreeBufList {public: FreeBufList() {} ~FreeBufList() {} void PushBack(const T& v...原创 2020-04-02 17:56:54 · 400 阅读 · 0 评论 -
vector深拷贝与浅拷贝使用总结
(1)、拷贝构造/赋值函数 --- 深拷贝 int w= 100; int h = 20; vector<int> dataA(w*h ,0Xff); vector<int> dataB = dataA; // copy 构造 int * ptr0 = &dataA[0]; int * ptr1 = &...原创 2020-03-06 16:12:03 · 7264 阅读 · 0 评论 -
std::vector中resize()和reserve()区别
在STL容器中vector用的还是比较多的,但是在使用时,会对resize()和reserve()的使用产生迷惑,现在就对这一情况做个对比:resize():改变的是size()与capacity()的大小(1)、比原来的变小之后,后面的会被截断(2)、比原来的变大之后,后面的会被填充新的东西,不同的编译器可能会不同。也可以自己指定后面填充的内容reserve():改变的只是...原创 2019-03-22 15:08:50 · 6667 阅读 · 2 评论 -
std::string的resize()与reserve()的区别
std::string的resize()与reserve()的区别:resize():改变的是size()与capacity()的大小(1)、比原来的变小之后,后面的会被截断(2)、比原来的变大之后,后面的会被填充新的东西,不同的编译器可能会不同reserve():改变的只是capacity()的大小程序如下:#include <math.h>#includ...原创 2019-03-21 13:46:16 · 3870 阅读 · 1 评论 -
boost::stable_vector简单解析
由于vector底层实现的机制是一个动态数组,因此使用std::vector<T>时,如果海量数据量时,会导致vector底层的数组很大很大,这样就会导致database很快就会出现内存不足而导致系统停止运行或卡住,这时就要考虑是否用其他的容器替换vector了,参考了很多的资料,找到了一个boost::stable_vector可以替换std::vector,这样就可以避免修改大量的...原创 2019-03-15 18:17:30 · 1835 阅读 · 0 评论 -
STL容器之deque
双端队列;序列式容器(deque/vector);底层分段连续支持从双端进行插入和删除;综合了vector和list的优点;插入、删除、查找的平均时间复杂度都是O(1)部分deque的操作如下:#include <stdlib.h>#include <iostream>#include <stdio.h>#include <deq...原创 2019-01-08 16:53:57 · 191 阅读 · 0 评论 -
boost::split()的使用方式
引用的头文件 <boost/algorithm/string.hpp>boost::split()函数用于切割string字符串,将切割之后的字符串放到一个std::vector<std::string> 之中;有4个参数:以boost::split(type, select_list, boost::is_any_of(","), boost::token_c...原创 2018-12-11 16:21:03 · 26932 阅读 · 2 评论 -
C++ string assign()赋值常用方法
C++ string assign()赋值常用方法函数assign()常用在给string类变量赋值.常用方法有:1,直接用另一个字符串赋值.如str2.assign(str1);即用str1给str2赋值.2,用另一个字符串的一个子串赋值如str3.assign(str1, 2, 3);3,用一个字符串的前一段子串赋值;如str4.原创 2017-07-07 11:45:10 · 864 阅读 · 0 评论 -
STL中vector<type>的复制
STL vector的复制#include #include using namespace std; int main() { vectorint> v1, v2; v1.push_back(11); v1.push_back(44); v2 = v1; co原创 2017-07-07 15:43:29 · 320 阅读 · 0 评论 -
STL中empty()函数的误用
今日在一个项目上排查问题时,找到一个关于empty()函数误写为empty,导致出现了错误#include #include using namespace std; int main() { string s = "abc"; if(s.empty) { cout "it原创 2017-07-07 19:53:12 · 2705 阅读 · 0 评论 -
C++中string.find()的误用
下面的结果是什么?#include #include using namespace std; int main() { string s = "abc"; if(s.find("x")) { cout "yes" } else {原创 2017-07-07 20:17:07 · 539 阅读 · 0 评论 -
两个栈来实现一个队列的C++代码
转载:http://blog.csdn.net/stpeace/article/details/46765343利用两个栈来实现一个队列, 这个问题很常见。 最关键的是要有好的思路, 至于实现, 那是很简单的事情了。 在本文中, 也想说说自己的思路, 但是, 我觉得用代码来表述思路更符合我的习惯, 也是我的菜, 所以, 仅仅给出代码。 如有需要, 大家可以根据代码来理解思路。转载 2017-07-07 20:39:31 · 441 阅读 · 0 评论 -
火眼睛睛查coredump(stl sort)------永远让比较函数对相同元素返回false
转载:http://blog.csdn.net/stpeace/article/details/51040218#cpp看看如下代码的一个非常隐晦的错误, 虽然不会每次core dump, 但类似代码迟早会core dump, 好多人遇到过。 此问题极难定位, 看一下吧:[cpp] view plain copy#include转载 2017-07-08 16:33:46 · 637 阅读 · 0 评论 -
STL Vector没有find()成员函数,只能用泛型find()
#include #include #include using namespace std; int main() { vectorint> v; v.push_back(10); v.push_back(23); v.push_back(35); if(find(原创 2017-07-08 16:36:47 · 1799 阅读 · 0 评论 -
STL中的multimap---顺便说说如何查找同一关键字对应的所有值
转载:http://blog.csdn.net/stpeace/article/details/44984639我个人感觉哈, map的应用场景比multimap更多, 不过, 我们还是来学一下multimap。 我们知道, multimap中, 一个关键字可能对应多个不同的值, 怎么获取呢?我们来看程序, 接招(介绍三种方法): 结果为:转载 2017-07-08 18:06:55 · 1021 阅读 · 0 评论 -
c++ STL 工程实践的15条建议
STL是c++非常重要的一部分,它是很多大神的杰作,高效,稳定,可扩展性好,虽然STL确实存在难以调试,内存碎片的问题(现在机器的内存越来越大,内存碎片的问题基本不太可能成为系统瓶颈,但只要你使用恰当,它能显著提高生产力,并使代码更短,更易维护。而在工程中,如果不养成好的使用习惯,也容易造成一些问题!而自己在工程实践中,总结了一些建议1. vector, map, set转载 2017-08-11 11:41:11 · 273 阅读 · 0 评论 -
STL中map的使用要点
我们都知道, 当map不存在某key时, 如果用下标操作, 便会产生新key。 因此, 要特别注意#include #include #include using namespace std; int main() { map m; m["k1"] = "good"; if(m["k3"] == "") {原创 2017-07-07 10:48:02 · 267 阅读 · 0 评论 -
asio strand的优点及strand与mutex的比较
void strand_service::do_post(implementation_type& impl, operation* op, bool is_continuation) { impl->mutex_.lock(); if (impl->locked_) { // Some other handler already h转载 2018-01-29 12:15:41 · 1255 阅读 · 0 评论 -
vector的内存释放
1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小。先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际...原创 2018-05-22 22:58:37 · 367 阅读 · 0 评论 -
vector占用内存的释放
vector<int> v1;v1.push_back(9);{ Vector<int>tmp = v1; V1.swap(tmp);}使用{ }的目的是让tmp退出{ }时自动析构。标准解决办法:template < class T >void ClearVector( vector< T >&vt ) { vector&l...原创 2018-05-23 13:37:40 · 723 阅读 · 0 评论 -
map与unordered_map的区别
set/map底层实现的机制是红黑树。红黑树是一种近似于平衡的二叉查找树,默认是按升序排序的。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。红黑树的缺点:空间占用率高,每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间。 std::unordered_map对应哈希表,哈希表的特点就是查找效率高,时间复杂度为常数级别O(1),而额外空间...原创 2018-10-12 12:17:44 · 1123 阅读 · 0 评论 -
vector中的reserve() 与 resize()
resize()与reserve()都是vector容器中的方法:resize():改变了capacity()和size()reserve():增加了vector的capacity(),但是它的size()没有改变#include <iostream>#include <stdio.h>#include <vector>#include<...原创 2018-12-11 09:57:28 · 5149 阅读 · 0 评论 -
STL中的map集合扩展字段比较方便
扩展字段map真是个好东西, 在定各种协议时很常用,便于扩展#include #include #include using namespace std; void fun(const map &mp) { } int main() { return 0; }原创 2017-07-07 10:36:41 · 307 阅读 · 0 评论