首页 > 代码库 > C++学习之路: STL探索 class的一些操作

C++学习之路: STL探索 class的一些操作

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         else35             ++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 }

 

C++学习之路: STL探索 class的一些操作