STL
容器、迭代器、算法、适配器、空间配置器、函数对象
适配器包括:函数适配器、迭代器适配器、容器适配器(stack和queue)
Step to Step_001
这个作者很懒,什么都没留下…
展开
-
函数对象类——function
//std::function是函数的容器:装函数类型 //函数类型:返回类型(参数1类型,参数2类型,...,参数n类型)比如:int add(double a, double b) 的函数类型就是int(double,double) //std::function是一个类 ...原创 2021-05-08 12:04:54 · 246 阅读 · 0 评论 -
空间配置器
一级空间配置器:只进行malloc堆空间的申请。 缺点:频繁的用户态到内核态的切换,开销大二级空间配置器(默认):当申请的内存>128B时,使用malloc申请堆空间;当申请的内存<=128时,使用自由链表管理内存分配 优点:申请小内存时,开销小速度快自由链表16个元素的数组:_S_free_list[_NFREELISTS]...原创 2021-04-25 18:34:01 · 183 阅读 · 0 评论 -
vector实现
#include <iostream>#include <memory>using std::endl;using std::cout;template<typename T>class Vector{public: using iterator = T *;//C++的写法 //typedef T* iterator ;//C的写法 Vector(int n); Vector() :_start (nullpt.原创 2021-04-25 16:26:38 · 169 阅读 · 0 评论 -
函数绑定器——bind()
1、绑定普通函数int add(int x , int y){ cout << "int add(int, int)" << endl; return x + y;}void test(){ //函数形态转变:int(int,int)-》int() //f的类型就是int(),但是直接写int() f=std::bind(add, 1, 2);会报错 auto f = std::bind(add, 1, 2); //std::f.原创 2021-04-25 16:15:09 · 167 阅读 · 0 评论 -
逆向迭代器
void test(){ vector<int> numbers{1, 4, 6, 90, 34}; vector<int>::reverse_iterator it = numbers.rbegin(); /* auto it = numbers.rbegin(); */ for(; it != numbers.rend(); ++it) { cout << *it << " "; } co.原创 2021-04-25 12:16:31 · 181 阅读 · 0 评论 -
函数适配/绑定器
bind1st原创 2021-04-25 01:46:50 · 63 阅读 · 0 评论 -
常用的算法函数
几个概念一元函数:函数的参数只有一个一元断言(谓词):一元的函数返回类型是bool二元函数:函数的参数只有两个二元断言(谓词):二元的函数返回类型是bool1、for_each()void print(int &number)//一元函数{ ++number; cout << number << " ";}void test(){ vector<int> numberVec = {1, 3, 5, 7.原创 2021-04-25 01:40:49 · 437 阅读 · 0 评论 -
迭代器适配器
迭代器适配器back_inserter函数模板,返回类型是back_insert_iteratorback_insert_iterator是类模板,底层调用了push_back函数front_inserter函数模板,返回类型是front_insert_iteratorfront_insert_iterator是类模板,底层调用了push_front函数inserter函数模板,返回类型是insert_iteratorinsert_iterator是类模板,底层调用了insert..原创 2021-04-24 23:32:38 · 58 阅读 · 0 评论 -
unordered_set初始化之自定义类型的元素
//标准命名空间进行扩展namespace std{//模板的特化template <>struct hash<Point>{ size_t operator()(const Point &rhs) const { return (rhs.getX() << 1 ) ^ (rhs.getY() << 2); }};bool operator==(const Point &...原创 2021-04-24 17:07:26 · 743 阅读 · 0 评论 -
set初始化之自定义类型元素
//报错,因为模板的第二个默认参数是std::less<Key>类,它只能对内置类型进行<比较,无法识别自定义类型的<操作set<Point> number = { Point(1, 2),Point(-2, 3) };3种解决方法:1、重载针对于Point类的operator<()bool operator<(const Point &lhs, const Point &rhs){ cout <<...原创 2021-04-24 16:34:44 · 183 阅读 · 0 评论 -
vector的insert()扩容
不一定按照两倍size()扩容 //insert扩容原理 //capacity() = n, size() = m, 待插入元素的个数t, //1、t < n - m;此时不会扩容 //2 n - m < t < m;此时按照2 * m扩容 //3、m < t < n,扩容t + m,容量最终为n+t+m //4、t > n,扩容t + m,容量最终为n+t+m...原创 2021-04-24 16:00:44 · 425 阅读 · 0 评论 -
序列式容器
1、清空元素clear();//容器元素清空。对于vector和deque并未回收内存,对于list回收了内存shrink_to_fit();//将内存缩减置合适,只有vector和deque有该成员函数2、vector的emplace_back()vector<Point> vec;vec.push_back(Point(1 , 2));vec.emplace_back(1 , 2);//Point(1, 2),隐式转换//和push_back()区别:push_b.原创 2021-04-24 15:41:02 · 58 阅读 · 0 评论 -
vector迭代器失效
1、使用insert()插入元素时底层发生了扩容操作或者元素后移2、使用erase()删除元素//要求删除所给数据中所有的偶数:(这种情况下,也会导致迭代器失效,具体原因如下图分析:)auto it = v.begin();while (it != v.end()){ if (*it % 2 == 0) v.erase(it); it++;}bug1:偶数删不掉(因为在删元素的时候后面的元素会往前挪动)bug2:删最后一个元素时,迭代器失效(.原创 2021-04-24 14:45:04 · 100 阅读 · 0 评论 -
deque的底层实现
_M_map指向中控器数组,数组里每个元素分别指向各自大小固定的连续区域(该区域保存deque的元素)_M_map_size是中控器数组的大小_M_start保存数组第一个元素指向的连续区域的信息_M_finisht保存数组的最后一个元素指向的连续区域的信息_M_cur指向...原创 2021-04-24 11:53:23 · 595 阅读 · 0 评论 -
输入/输出流迭代器源码阅读
1、输出流迭代器int main(int argc, char **argv){ vector<int> number = {1, 4, 7, 9, 5, 3}; ostream_iterator<int> osi(cout, "\n"); copy(number.begin(), number.end(), osi); return 0;}class ostream_iterator {public: ostream_iter原创 2021-04-22 21:04:01 · 199 阅读 · 0 评论 -
vector的size()返回的是无符号数
vector<int> nums; cout<<nums.size()-2<<endl;vector<int> nums;cout<<(int)nums.size()-2<<endl;原创 2021-01-24 00:18:28 · 240 阅读 · 0 评论 -
对vector使用sort函数
vector<int> a;sort(a.begin(), a.end());原创 2021-01-23 22:47:48 · 4473 阅读 · 0 评论 -
C++的vector赋值
C++的vector赋值一维vectorpush_back(x):向容器尾部增加一个元素X例:vectorgoal;goal.push_back(x); //不能用goal[0]=x;二维vector原创 2021-01-19 17:57:55 · 232 阅读 · 0 评论 -
C++用vector实现set的功能
判断是否是重复的元素,不重复的才放入容器vector<string> vec_words;set<string> set_words;string word;while (cin >> word) {//在vector中存储不重复的单词,首先要判断当前存入的单词是否已经存在了,用find函数来判断if (find(vec_words.begin(), vec_words.end(), word) == vec_words.end()) { vec_word原创 2021-01-17 23:49:58 · 881 阅读 · 0 评论 -
string append方法
C++ string append()在string后面添加文本使用append()添加文本常用方法:直接在后面添加另一个完整的字符串:如str1.append(str2);添加另一个字符串的某一段子串:如str1.append(str2, 11, 7);添加几个相同的字符:如str1.append(5, ‘.’);...原创 2021-01-17 21:03:32 · 9976 阅读 · 0 评论 -
string类insert函数
tring &insert(int p0, const char *s);——在p0位置插入字符串sstring &insert(int p0, const char *s, int n);——在p0位置插入字符串s的前n个字符string &insert(int p0,const string &s);——在p0位置插入字符串sstring &insert(int p0,const string &s, int pos, int n);——在p0位置插转载 2021-01-17 20:59:53 · 1503 阅读 · 0 评论