• C++学习之路: STL探索 list<>的一些基本操作(成员函数)


    1.当我们把类体内的一些成员函数设置为private时, 外部用户(除了该类内部的用户)则无法调用该函数。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 
     6 //Test不支持复制和赋值。所以不能放入vector
     7 class Test
     8 {
     9     public:
    10         Test() {}
    11 
    12     private:
    13         //设为私有,禁用了Test的复制和赋值能力 
    14         Test(const Test &); //用于复制
    15         void operator=(const Test &); //用于赋值
    16 };
    17 
    18 int main(int argc, const char *argv[])
    19 {
    20     vector<Test> vec;
    21     Test t;
    22     vec.push_back(t);
    23     return 0;
    24 }

    我们稍微解释一下上面那个 operator操作符, 那个是类的赋值操作函数,  例如我们定义 Test t1, t2  它们的+法,* 法默认的定义由编译器载入, 当我们把赋值 操作设为私有, main函数中的赋值

    则无法进行, 因为赋值要调用operator ,但是它已经是私有的了, 外部用户无法访问。 但是类的内部成员还是可以调用operator。

    2.list的一些基本操作

    除了push_back  多了一个push_front, 还有一个insert, 有一个find()用于查找成员的POS,这些成员函数都要多个版本, 即它们的输入参数是多样化的。

    迭代器是重要的,参数,一定要好好学习迭代器。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <list>
     5 #include <map>
     6 #include <set>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 
    11 void print(const list<string> &lst)
    12 {
    13     for(const string &s : lst)
    14     {
    15         cout << s << " ";
    16     }
    17     cout << endl;
    18 }
    19 
    20 int main(int argc, const char *argv[])
    21 {
    22     list<string> lst;
    23     lst.push_back("hangzhou");
    24     lst.push_front("tianjin");
    25     lst.push_front("shanghai");
    26 
    27     print(lst);
    28     
    29     lst.insert(lst.begin(), "shenzhen");
    30     print(lst);
    31 
    32     lst.insert(lst.end(), "longhua");
    33     print(lst);
    34 
    35     
    36     list<string>::iterator it = find(lst.begin(), lst.end(), "tianjin");
    37     lst.insert(it, "fenghua");
    38     print(lst);
    39 
    40 
    41     return 0;
    42 }

    3.删除操作

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <list>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 
     9 
    10 void print(const list<string> &lst)
    11 {
    12     for(const string &s : lst)
    13     {
    14         cout << s << " ";
    15     }
    16     cout << endl;
    17 }
    18 /*
    19  * 删除单个元素
    20  *
    21  */
    22 int main(int argc, const char *argv[])
    23 {
    24     list<string> lst;
    25     lst.push_back("hangzhou");
    26     lst.push_front("tianjin");
    27     lst.push_front("shanghai");
    28 
    29    
    30     print(lst);
    31     list<string>::iterator it = find(lst.begin(), lst.end(), "tianjin");
    32     lst.insert(it, 3, "beijing");
    33     print(lst);
    34 
    35 
    36     it = find(lst.begin(), lst.end(), "tianjin");
    37     lst.erase(it);
    38     print(lst);
    39 
    40 
    41     return 0;
    42 }

    (2).注意迭代器失效的问题,因为list是非线性存储,是离散的,当我们删除一个成员时, 迭代器 it会变成野指针,无指向,对它++操作是没有意义的。、

    必须接收erase的返回值, erase会返回下一元素的迭代器。这样就不需要++操作的。 vector是线性的,所以可以不用接收返回的迭代器。

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    
    
    
    
    void print(const vector<int> &lst)
    {
        for(int t : lst)
        {
            cout << t << " ";
        }
        cout << endl;
    }
    
    int main(int argc, const char *argv[])
    {
        vector<int> vec;
        srand(23456);
    
        for(int i = 0; i != 20; ++i)
        {
            vec.push_back(rand() % 100);
        }
        print(vec);
    
        vector<int>::iterator it = vec.begin();
        while(it != vec.end())
        {
            if(*it % 2 == 0)
                //vec.erase(it);
                it = vec.erase(it);   //
            else
                ++it;
        }
    
    
        print(vec);
    
    
    
        return 0;
    }

    (3).如果是list,it 如果不接收返回的迭代器,就无所指向,将出现段错误。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <list>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 void print(const list<int> &lst)
     9 {
    10     for(int t : lst)
    11     {
    12         cout << t << " ";
    13     }
    14     cout << endl;
    15 }
    16 
    17 int main(int argc, const char *argv[])
    18 {
    19     list<int> lst;
    20     srand(23456);
    21 
    22     for(int i = 0; i != 20; ++i)
    23     {
    24         lst.push_back(rand() % 100);
    25     }
    26     print(lst);
    27 
    28     list<int>::iterator it = lst.begin();
    29     while(it != lst.end())
    30     {
    31         if(*it % 2 == 0)
    32             //lst.erase(it);  //error 段错误, 删除操作后, 迭代器无指向, ++操作指向非法内存,非法访问导至段错误。
    33             it = lst.erase(it);
    34         else
    35             ++it;
    36     }
    37 
    38 
    39     print(lst);
    40 
    41 
    42 
    43     return 0;
    44 }

    4.输入迭代器范围还可以删除一段元素

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int main(int argc, const char *argv[])
     8 {
     9     vector<string> vec;
    10     vec.push_back("beijing");
    11     vec.push_back("shanghai");
    12     vec.push_back("tianjin");
    13     vec.push_back("shenzhen");
    14     vec.push_back("changchun");
    15 
    16     for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it){
    17         cout << *it << " ";    
    18     }
    19     cout << endl;
    20 
    21     vector<string>::iterator it1, it2;
    22     it1 = find(vec.begin(), vec.end(), "shanghai");
    23 
    24     it2 = find(vec.begin(), vec.end(), "shenzhen");
    25 
    26     vec.erase(it1, it2);      //删除一段元素。
    27 
    28 
    29     for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it){
    30         cout << *it << " ";    
    31     }                    
    32     cout << endl;
    33 
    34 
    35 
    36 
    37     return 0;
    38 }
  • 相关阅读:
    centos7装NVIDIA显卡驱动
    前端MVC学习笔记(三)——AngularJS服务、路由、内置API、jQueryLite
    前端MVC学习笔记(二)——AngularJS验证、过滤器、指令
    前端MVC学习笔记(一)——MVC概要与angular概要、模板与数据绑定
    JavaScript学习笔记(四)——jQuery插件开发与发布
    JavaScript学习笔记(三)——this、原型、javascript面向对象
    Node.js学习笔记——Node.js开发Web后台服务
    JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
    JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
    【趣味分享】C#实现回味童年的24点算法游戏
  • 原文地址:https://www.cnblogs.com/DLzhang/p/3987199.html
Copyright © 2020-2023  润新知