c++之STL模板,vector与string

一,vectorc++

  名字:向量,本质:数组,存在乎义:解决动态数组问题,咱们知道c++的数组定义,必定要肯定具体的大小,由于这个涉及到内存的分配,肯定小了,又不够用,太大又浪费,因此推出了动态的肯定素组的大小,数组

  原理:先分配一个N大小的数组,而后对该向量进行操做,若是不断插入,而空间不能知足须要,则会自动从新申请一个更大的空间,把原来的值复制过去,而后删除掉原来的空间,这样就达到了动态修订数组大小的目的;数据结构

  底层结构:app

 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仅仅表示下标,而非存入数据)spa

功能指针

  构造:vector<T> p;       默认构造,构造一个空的向量,而后向里面添加数值,注意由于是空的,因此不能经过[]访问;code

      p(n):         默认构造一个大小为n的向量,能够初始里面的数值全为0,或者其余,由于已经存在,因此能够直接使用[]访问;blog

      p(t.begin(),t.end());  默认把数据t范围内的数据所有导入到向量p中,好比map,list,普通数组等等,均可以使用这个功能转化数据结构;接口

using namespace std; int main() { vector<int> p1; //第一种 vector<int> p2(10,1); //第二种 cout << p2[5] << endl; p2[3] = 10; vector<int> p3(p2.begin()+3, p2.end()); //第三种 cout << p3[0] << endl; system("pause"); return 0; }
//打印结果 1 10;
 

  增长:insert()         选定压入的位置指针(而不是下标!),与数据,好比说 p.insert(p.begin()+1,33) 把数据33压入到第二个位置(记住,数组无论是插仍是输,都是直接使用指针,而不是值),那么后面的数据就会所有move,向后面移动,耗时比较慢!内存

      push_back()  将数据压入到最后面,尾部。

using namespace std; int main() { vector<int> p2(10,1); cout << p2.size() << endl; p2.insert(p2.begin() + 3, 100); p2.push_back(10); cout << p2[3] << endl; cout << p2.size() << endl; system("pause"); return 0; }
//结果 10 100 12

  删除: erase()    指定要删除的指针位置,删除后,又会发生移动,比较慢

       pop_back() 删除最后一个元素

       clear()删除所有内容

  

using namespace std; int main() { vector<int> p2(10,1); cout << p2.size() << endl; p2.erase(p2.begin() + 1); p2.pop_back(); cout << p2.size() << endl; system("pause"); return 0; } //结果10 8

 

  遍历:p[] 最简单的,咱们知道[]至关于 *(p+i)的意思,那么直接使用下标访问也能够,从0到p.size(),注意越界问题;

     begin(),end() 也可使用迭代器访问;

using namespace std; int main() { vector<int> p2(10,1); for (int i = 0; i < p2.size(); i++) cout << " " << p2[i]; cout << endl; for (auto it = p2.begin(); it != p2.end(); it++) cout << " " << *it; system("pause"); return 0; } //结果 1 1 1 1 1 1 1 1 1

 

  特殊:front(): 返回第一个元素的值    back():返回最后一个元素的值;

     size():返回该向量的有效大小  empty():返回这个向量是否为空,为空返回的是1,不要搞反了!  reserve()从新设置向量的大小;

  由于这个是普通数组,查找速度很慢,因此,没有提供查找find()方法;

二,string

 原理:使用的底层和vector相同,因此放在一块儿,字符char类陈,字符串=字符组,char[],以'/0'结尾,而string就是封装了这个数据结构,增长了不少实用的接口,好比说增删查改等等;原理和vector同样,就很少说直接跳入功能部分

 功能

    构造: string s1=" ";最经常使用的构造方式;

    插入: append(4,'a');在字符串的末尾添加4个a,注意!若是标注了多少个,那么后面就要使用单一的字符

       append("aa");若是是字符串“ ”那么就不须要标注重复多少个!

       push_back():与前面都同样,不经常使用;一样只能放出单一的字符,而不是字符串!

      +:最经常使用,重载后的+,s=s1+s2;

  

using namespace std; int main() { string s1 = "1231234"; cout << s1 << endl; s1.append(3, '0'); cout << s1 << endl; s1.append("999"); cout << s1 << endl; s1.push_back('a'); cout << s1 << endl; string s2 = "ttt"; string s = s1 + s2; cout << s << endl; system("pause"); return 0; } /*结果:1231234 1231234000 1231234000999 1231234000999a 1231234000999attt*/

 

    删除: erase(4);从下标4开始,包括下标4,后面的所有删除了

       erase(4,2);从下标4开始,包括下标4,删除两个符号

 

using namespace std; int main() { string s1 = "1231234"; s1.erase(4,1); cout << s1 << endl; s1.erase(4); cout << s1 << endl; system("pause"); return 0; }/* 123134 1231*/

 

    修改: substr(4,2);提取字符串内的子字符串,返回的是提取出来的值,而原字符串不会发生改变,能够和earse()配套使用;

 

int main() { string s1 = "1231234"; string s2 = s1.substr(4, 2); cout << s1 << " " << s2 << endl; system("pause"); return 0; } 结果:1231234 23

 

    查找: find("aa")   返回发现“aa"的第一个下标,默认从0开始遍历,一下全都同样,若是没有找到,都是返回-1.

        find(1,"aa")从1开始遍历,从1开始,返回找到的第一个下标。

       find_first_of():找到一个值,返回该值的下标。

       find_last_of():倒着开始找,找到了返回该值的下标。

 

int main() { string s1 = "1231234"; cout << s1.find('1') << endl; cout << s1.find('5') << endl; cout << s1.find_first_of('2') << endl; cout << s1.find_last_of('2') << endl; system("pause"); return 0; } 结果:0 -1 1 4

 

    替换: replace(),与substr()很像,与list的归并也很像;

相关文章
相关标签/搜索