提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
做题时常常会遇到学过,但又忘记的C语言知识点,现将一些常用的c/c++工具记录在此。
vector
vector是c++中常用的数组容器,采用alloc动态存储。每次到达上限,依据现有长度,动态增加。在内存中寻找一块更大的连续地址,再将现有内容转移。
insert数据时,将增加数据的地址以及之后的所有内容向后移动一个单位,再将数据填入其中。
erase数据时,将该数据之后的每个数据向前移动一个单位。所以insert和erase非常占用内存。
常用的如:
push_back();
void push_back(const T& x){
if(finish != end_of_storage){
constuct(finish,x);
++finish; //如果有剩余空间,在最后添加数据
}else{
insert_aux(end(),x);
//构造新的空间,并且将新空间前半段放原来的数据,后半段准备放新的数据。
}
}
pop_back();
void pop_back(){
--finish;//表示最后一个元素的后一个位置,即调用end();
destory(finish);//调用被取出数据的析构函数。
}
erase();
iterator erase(iterator first,iterator last)
//清除[first,last]中的所有元素
iterator erase(iterator position)
//清除position位置的元素
删除指定位置的元素后,将后面的元素依次往前转移。
insert
void insert(iterator position,size_type n,const T& x){
//判断剩余空间够不够放新增加的元素
//如果够放
if(true){
//将插入点后面的数据往后移
//再将元素依次插入到插入点。
}else{//如果不够放
//配置新的,更大的空间,再将旧的数据放入新空间。
//然后按上述方法,数据后移再插入新数据。
}
}
list
list 是c++中的双向链表。且list是一个环状双向链表。
template <class T>
struct __list_node{
typedef void* void_pointer;
void_pointer prev;//类型为void*
void_pointer next;
T data;//类型与模板一致
}
list对元素的操作有:
push_front
push_back
erase
pop_front
pop_back
clear
remove
unique
splice
merge
reverse
sort
map
map的特性是:所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key);
标准STL map以红黑树作为底层机制,又由于map的各种操作接口RB-tree也提供了,所以几乎所以的map操作都是调用RB-tree的操作行为。其查找插入都是O(Logn)
STL中还有unordered_map,它的底层是哈希表,是无序的,查找和插入都是O(1);
map与unordered_map的区别
find
很久没有用到这个函数,以为是容器自带的,找了好久没有,才想起来是个独立函数。
vector<int>::iterator it=find(vin.begin(), vin.end(), q.front());
使用find函数,提供需要寻找的范围,以及寻找的内容。返回值是个指针或者说迭代器。
这个是C的语法。我把这个find和C++中string的成员函数find搞混了;
String
c++中比较常用的字符串,内建许多函数,在这里列出几个常用的。
tolower
将字符串中的大写字母转换为小写字母。若非大写字母,则保持不变。
同样的还有toupper;
find
str.find(char c,int pos)
返回字符串中该字符的位置,第二个参数为起始位置,缺省值为0即从头开始。
str.rfind()
反向查找,从最后一个字符往前搜索。
int pos=0;
while(pos=str.find(flag,pos)!=-1)
{
cout<<pos<<endl;
pos++;
}
这个技巧可以找出整个字符串中所有的flag元素。
cout
cout.width(8)
输出的宽度为8,不足8个自动补齐。
cout.fill(‘0’),自动补齐为数字0;
cout<<left
左对齐,即输出不足8个时,已有内容从左边开始输出,如abcd0000;