一,vector
名字:向量,本质:数组,存在意义:解决动态数组问题,我们知道c++的数组定义,一定要确定具体的大小,因为这个涉及到内存的分配,确定小了,又不够用,太大又浪费,所以推出了动态的确定素组的大小,
原理:先分配一个N大小的数组,然后对该向量进行操作,如果不断插入,而空间不能满足需要,则会自动重新申请一个更大的空间,把原来的值复制过去,然后删除掉原来的空间,这样就达到了动态修订数组大小的目的;
底层结构:
| 0:M_start指针, M_finish指针 | 1 | 2 | 3 | 4 | 5 | 6 | 7 M_end指针-> |
初始化的时候,分配一个N大小的,然后start指针和finish指针都指向第一个结点,而end指向最后一个结点的下一个结点地址;这样,如果遍历到了end就说明这个向量结束了,而finish是指向的最后一个数据的指针,比如说,插入三个数据,那么数据就插入到finish的位置,随之finish+3;(图中数字1~7仅仅表示下标,而非存入数据)
功能:
构造:vector<T> p; 默认构造,构造一个空的向量,然后向里面添加数值,注意因为是空的,所以不能通过[]访问;
p(n): 默认构造一个大小为n的向量,可以初始里面的数值全为0,或者其他,因为已经存在,所以可以直接使用[]访问;
p(t.begin(),t.end()); 默认把数据t范围内的数据全部导入到向量p中,比如map,list,普通数组等等,都可以使用这个功能转化数据结构;
增加:insert() 选定压入的位置指针(而不是下标!),与数据,比如说 p.insert(p.begin()+1,33) 把数据33压入到第二个位置(记住,数组不管是插还是输,都是直接使用指针,而不是值),那么后面的数据就会全部move,向后面移动,耗时比较慢!
push_back() 将数据压入到最后面,尾部。
删除: erase() 指定要删除的指针位置,删除后,又会发生移动,比较慢
pop_back() 删除最后一个元素
clear()删除全部内容
遍历:p[] 最简单的,我们知道[]相当于 *(p+i)的意思,那么直接使用下标访问也可以,从0到p.size(),注意越界问题;
begin(),end() 也可以使用迭代器访问;
特殊:front(): 返回第一个元素的值 back():返回最后一个元素的值;
size():返回该向量的有效大小 empty():返回这个向量是否为空,为空返回的是1,不要搞反了! reserve()重新设置向量的大小;
因为这个是普通数组,查找速度很慢,所以,没有提供查找find()方法;
二,string
原理:使用的底层和vector相同,所以放在一起,字符char类陈,字符串=字符组,char[],以‘/0‘结尾,而string就是封装了这个数据结构,增加了很多实用的接口,比如说增删查改等等;原理和vector一样,就不多说直接跳入功能部分
功能:
构造: string s1=" ";最常用的构造方式;
插入: append(4,‘a‘);
append("aa");
push_back():与前面都一样,不常用;
+:最常用,重载后的+,s=s1+s2;
删除: erase(4);从下标4开始,包括下标4,后面的全部删除了
erase(4,2);从下标4开始,包括下标4,删除两个符号
修改: substr(4,2);提取字符串内的子字符串,返回的是提取出来的值,而原字符串不会发生改变,可以和earse()配套使用;
查找: find("aa") 返回发现“aa"的第一个下标,默认从0开始遍历,一下全都一样,如果没有找到,都是返回-1.
find(1,"aa")从1开始遍历,从1开始,返回找到的第一个下标。
find_first_of():找到一个值,返回该值的下标。
find_last_of():倒着开始找,找到了返回该值的下标。
替换: replace(),与substr()很像,与list的归并也很像;
原文:https://www.cnblogs.com/yidiandianwy/p/11562255.html