数据库连接池
在数据库链接池的初始化的过程中,call Init(url,user,password,port,maxCount…)
其中使用list来组织代码,list本身是双向链表容器
- begin 获取第一个元素的双向迭代器
- end 获取最后一个元素的下一个位置的双向迭代器
- rbegin
- rend
- cbegin 不能用于修改元素
- cend
- empty 判断容器是否为空,返回 true or false
- size 容器当前包含元素的个数
- max_size 容器最大容量 (windows x86 value = 357913941 3亿多)
- front 容器第一个元素的引用
- back 容器最后一个元素的引用
- assign 替换原有内容
- emplace_front 头插一个新元素(同push_front)听说效率更高 empalce 翻译成【放置】(无法放置的灵魂)
- emplace_back 尾插一个新元素(同push_back)听说效率更高
- pop_front 从头部删除一个 并没有返回值 和front一起使用 容器为空会报错(win32 会弹窗)
- pop_back 从尾部删除一个 并没有返回值 和back一起使用 (容器为空 同上)
- emplace 插入
- clear 清空容器,删除所有元素
- resize 针对 size 的修改
- remove(value) 删除容器中的值为value元素
- push_back
- push_front
- rbegin
- rend
- insert
- splice
- erase
- swap() 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
- remove_if() 删除容器中满足条件的元素。
- unique() 删除容器中相邻的重复元素,只保留一个。
- merge() 合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
- sort() 通过更改容器中元素的位置,将它们进行排序。
- reverse() 反转容器中元素的顺序。
- BidirectionalIterator 双向迭代器
int Size = 10;
for (int i = 0;i < Size;i++) {
int* pvalue = new int(i);
valuePool.push_back(pvalue);
}
其中的push_back-尾插,向后增长。
list<int*>::iterator it = valuePool.begin();
for (;it != valuePool.end();it++)
printf("%d ", **it);
0 1 2 3 4 5 6 7 8 9
针对valuePool的遍历。
int Size = 10;
for (int i = 0;i < Size;i++) {
int* pvalue = new int(i);
valuePool.push_front(pvalue);
}
9 8 7 6 5 4 3 2 1 0
其中的push_front-尾插,向前增长。
int Size = 10;
for (int i = 0;i < Size;i++) {
int* pvalue = new int(i);
valuePool.push_front(pvalue);
}
9 8 7 6 5 4 3 2 1 0
auto i = valuePool.rbegin();
i = 0
i-- (windows会报错,linux目前不清楚)
i++;(1)
i++;(2)
反向迭代器-rbegin指向最后一个(反的开始就是最后) ,++是从右到左,–是从左向右。
auto j = valuePool.rend();
//j++; //error
j--; (9)
j--; (8)
反向迭代器-rend() 指向第一个的前一个位置,++是从右到左,–是从左向右。
list<int*>::iterator it_mov = valuePool.begin();
9 8 7 6 5 4 3 2 1 0
++ it_mov;
it_mov -> 8
auto insert_it = valuePool.insert(it_mov,new int(100));
9 100 8 7 6 5 4 3 2 1 0
insert_it -> 100
insert() 操作迭代器不会失效,前插数据,有返回迭代器
list<int*> valueRight;
valueRight.push_back(new int(-1));
valueRight.push_back(new int(-2));
valueRight.push_back(new int(-3));
list<int*>::const_iterator cit = valuePool.cend(); //不能对它解引用
若 valuePool.splice(valuePool.cend(),valueRight);
9 8 7 6 5 4 3 2 1 0 {-1 -2 -3}
若 valuePool.splice(--valuePool.cend(),valueRight);
9 8 7 6 5 4 3 2 1 {-1 -2 -3} 0
若 valuePool.splice(valuePool.cbegin(),valueRight);
-1 -2 -3 9 8 7 6 5 4 3 2 1 0
splice()操作合并操作,迭代器指向元素则,前插。迭代器指向end(),前插+end();
list<int*>::iterator it_mov = valuePool.begin();
++ it_mov;
it_mov->8
auto nullit = valuePool.erase(it_mov);
nullit->8 it_mov->???
erase() 操作 删除一个迭代器指向的元素,it_mov便失效。
valuePool.assign(5, new int(-1));
-1 -1 -1 -1 -1
valuePool.assign(valueRight.begin(), valueRight.end());
-1 -2 -3
assign 将容器中替换原有内容
valuePool.emplace(valuePool.end(),new int(100));
emplace在指定位置插入。
std::list是双向迭代器BidirectionalIterator,双向迭代器不只支持+, -操作,只支持**++**, **–**操作
可以大致看一遍,掌握好“大致”的程度。了解自己,不能自己欺骗自己。常用的基本够用了,一些不常用的,需要的时候重点学习一下。