zoukankan      html  css  js  c++  java
  • C++学习STL之顺序容器(持续更新)

    STL 标准模板库

     标准模板库(Standard Template Library,缩写:STL)是一个C++软件库,  包括5个组件,分别是:算法、容器、迭代器,函数和适配器。  

     一:容器之初始化:

    1.直接初始化一个空的容器;

    2.用一个容器去初始化另一个容器;

    3.指定容器的初始大小;

    4.指定容器的初始大小和初始值;

    5.用一对迭代器范围去初始化容器。

     示例代码如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <fstream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 void print(vector<string> &vec)
     9 {
    10     for(vector<string>::iterator it = vec.begin(); 
    11         it != vec.end();
    12         ++it)
    13     {
    14         cout << *it << endl;    
    15     }
    16 }
    17 
    18 int main(int argc, const char *argv[])
    19 {
    20     vector<string> vec ;//num.1
    21     vec.push_back("changjiang");
    22     vec.push_back("huanghe");
    23     vec.push_back("dahai");
    24     vec.push_back("beijing");
    25     vec.push_back("shanghai");
    26     vec.push_back("guangdong");
    27 
    28     vector<string> vec2(vec); //num.2
    29     cout<< "num2:" << endl ;
    30     print(vec2); 
    31 
    32     vector<string> vec4(4, "test");//num.4容器大小和初始值
    33     cout << "num.4:" << endl ;
    34     print(vec4); 
    35     
    36     vector<string>::iterator it1,it2 ;
    37     it1 = vec.begin();
    38     it2 = find(vec.begin(), vec.end(), "dahai");
    39     vector<string> vec5(it1, it2);//num.5 changjiang+huanghe
    40     cout << "num.5" << endl;
    41     print(vec5); 
    42 
    43     return 0;
    44 }

    注意 (第二种与第五种初始化方式的区别):

    //采用引用方式。

    1):num.2 不仅要求是 容器类型(vector<string>) 而且要求 容器元素类型(string);

    //采用值copy方式。

    2):num.5 不要求  容器类型相同,对于 容器元素,要求能相互兼容即可

    如 vector<int> vec

    可以用 list<double>,vector<int>,list<int>


    另外C++中,指针也可以当做迭代器,示例如下:

     1 //指针也可以做迭代器。
     2 int main(int argc, const char *argv[])
     3 {
     4     const size_t MAX_S = 4 ;
     5     string arr[MAX_S] = {"hello", "world", "foobar"};
     6 
     7     vector<string> vec(arr, arr + MAX_S);
     8 
     9     for(vector<string>::iterator it = vec.begin(); 
    10         it != vec.end(); 
    11         ++it)
    12     {
    13         cout << *it << endl;    
    14     }
    15     return 0;
    16 }

    二:容器元素的约束类型:

    1、容器 元素 必须支持赋值操作;

    2、元素类型的 对象 必须可以复制。

    示例如下:

     1 //将构造函数设为私有成员函数
     2 class Stu
     3 {
     4     //根源
     5     private:
     6         Stu(const Stu&);
     7         Stu &operator = (const Stu&);
     8 
     9 };
    10 
    11 int main(int argc, const char *argv[])
    12 {
    13     vector<Stu> vec(10);//error
    14     return 0;
    15 }

    三:迭代器(前面我们已经用过迭代器的部分操作,今天我们系统探讨):

    1):四个特殊的迭代器成员:

    c.begin() //指向容器C的第一个元素

    C.end() //指向最后一个元素的下一个位置

    C.rbegin() //返回一个逆序迭代器,指向容器c的最后一个元素

    C.rend() //返回一个逆序迭代器,指向容器c的第一个元素的前面的位置

    2):迭代器的基本操作:

    *it 、it-> 、 ++it 、 --it  iter1 = iter2、iter2 != iter1

    首先我们先介绍一个for循环

    for(vector<string>::iterator it = vec.begin() ;

      it != vec.end();

      ++it)

    { cout << *it << endl ; }

    上面代码的作用是:打印 容器vec 中的元素 至屏幕。

    注意上述 for 循环中

    vec.begin()是 第一个元素的位置。

    vec.end() 是 最后一个元素的下一个位置。

    3):迭代器的范围(左闭右开区间)的优点:

    a、当 begin 与 end 相等时,迭代器范围为空;

    b. 当 begin 与 end不相等时,迭代器范围内至少有一个元素,而且 begin 指向该区间中的第一元素。此外,通过若干次自增运算可以使 begin 的值不断增大,直到 fbegin == end 为止。

    增加元素: 

    示例代码如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <list>
     4 #include <vector>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 //insert
     9 void print(const list<string> &lst)
    10 {
    11     for(list<string>::const_iterator it = lst.begin(); 
    12         it != lst.end(); 
    13         ++it)
    14     {
    15         cout << *it << " ";    
    16     }
    17     cout << endl ;
    18 }
    19 
    20 int main(int argc, const char *argv[])
    21 {
    22     list<string> lst ;
    23     lst.push_back("shanghai");//back
    24     lst.push_front("shenzhen");//front
    25     //inset one
    26     cout <<"first" << endl;
    27     print(lst);
    28     
    29     lst.insert(lst.begin(), "huaibei");
    30     print(lst);
    31 
    32     lst.insert(lst.end(), "anhui");
    33     print(lst);
    34 
    35     list<string>::iterator it = find(lst.begin(), lst.end(), "shanghai");
    36     lst.insert(it, "fenghua");
    37     print(lst);
    38     
    39     //insert nums
    40     cout << "last" << endl;    
    41     lst.insert(it, 3, "beijing");
    42     print(lst);
    43 
    44     lst.insert(lst.end(), lst.begin(), lst.end());
    45     print(lst);
    46     return 0;
    47 }

    迭代器失效问题:
    任何 insert 或者 push 操作都可能到时迭代器失效。当循环将元素插入到 vector或者list中,

    程序必须确保在每次循环后都得到更新。

    删除与查询 操作与insert 操作类似,不再赘述。

    常用: lst.pop_back() 、lst.pop_frong() 、 lst.earse(it)(需要判断是否要返回下标)。

    lst.erase( first, last)。lst.erase(lst.begin(), lst.end());

    容器的容量问题:

    代码如下:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <fstream>
     5 using namespace std;
     6 
     7 void print(const vector<int> &vec)
     8 {
     9     for(vector<int>::const_iterator it = vec.begin();
    10         it != vec.end(); 
    11         ++it)
    12     {
    13         cout << *it << " ";    
    14     }
    15     cout << endl;
    16 }
    17 //resize相当于加人,减人。capacity没有变化(改变时2的倍数)
    18 int main(int argc, const char *argv[])
    19 {
    20     vector<int> vec ;
    21     vec.push_back(12);
    22 
    23     cout << vec.size() << endl ;
    24     cout << vec.empty() << endl ;
    25     
    26     vec.resize(5);//加上4个数
    27     cout << vec.size() << endl ;
    28     print(vec); 
    29     
    30     vec.push_back(12);
    31     vec.push_back(12);
    32     vec.push_back(12);
    33     vec.push_back(12);
    34     vec.push_back(12);
    35 
    36     vec.resize(7);//减去三个数
    37     print(vec);
    38     
    39     vec.reserve(20);//重置capacity
    40     cout << vec.size()<< endl;
    41     cout << vec.capacity() << endl ;
    42 
    43     return 0;
    44 }


    简述:

    1):Vector和list的区别

    Vector内部 采用顺序表实现,而list采用链表实现,所以二者的差别很大程度是顺序表和链表的差别。

    2):截取字串substr;

    3):Append:在string后面串接新的字符串;

    4):Replace:字符插入到某些位置,并替换已经存在的字符;

  • 相关阅读:
    算法导论13:双向循环链表 2016.1.13
    ansible
    mariadb集群配置(主从和多主)
    连接查询,视图,事物,索引,外键(第四章)
    MariaDB第三章(select)
    mariadb第二章-增删改
    mariadb(第一章)
    keepalived概述
    git操作
    django后台admin管理布局
  • 原文地址:https://www.cnblogs.com/xfxu/p/3987300.html
Copyright © 2011-2022 走看看