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         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 }
时间: 2024-07-28 21:08:47

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

MySQL学习之路(二) MySQL基础操作

进入数据库 use 库名: 创建表结构 语法:create table 库名.表名( 字段名 数据类型 约束, 字段名 数据类型 约束 ) create table text.t_user( id int(10), t_name varchar(10) --最后一行不需要逗号 ) 查看所有表 show tables; 查看表中字段属性 desc t_user; describe t_user; show columns from t_user; 重新命名表名 rename table t_use

oracle学习之路(五)-----oracle数据类型的一般操作

1. 一些常见的运算符 运算符 意义 = 等于 <> , != , ~= , ^= 不等于 < 小于 > 大于 <= 小于或等于 >= 大于或等于 + 加号 - 减号 * 乘号 / 除号 := 赋值号 => 关系号 .. 范围运算 || 字符连接符 IS NULL 是空值 BETWEEN AND 介于两者之间 IN 在一列值中间 AND 逻辑与 OR 逻辑或 NOT 取返,如IS NOT NULL, NOT IN 2.变量赋值 在PL/SQL编程中,变量赋值是一个

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

我的STL学习之路

说起STL(标准模板库),相信了解C++的都不会陌生吧^_^.LZ是从大三开始学习C++(ps:不是科班出身),并慢慢接触使用STL的,在学校中使用STL比较多的情况是写数据结构代码,使用STL实现数据结构代码(我的数据结构源码),使我们专注于考虑算法思想,不拘泥于底层代码实现. 这里LZ不讲STL的具体知识,只讨论关于STL的学习和使用问题!结合LZ的学习过程,LZ觉得C++的学习(当然,这其中包括的STL)大致路线如下: 学习C++基本语法 掌握类.继承.多态等概念 理解面对对象和泛型编程思

[C++基础]029_C++学习之路

[C++基础]029_C++学习之路 看了一个多星期的C++,找了很多博客来计划铺垫未来C++学习之路,发现C++的水不是一般的深,虽然没有J2EE里面的各种框架,但是其本身已极尽复杂.个人才踩到了一点水皮,下面是摘录的一些博客上的内容,有需要学C++的,一起学习: C++高手需知知识(其中一部分,但有代表性) 虚函数是什么函数?为什么需要虚函数?普通基类和虚基类的区别是什么?虚继承的作用是什么? 什么是虚函数表?在多重继承关系下,虚函数表是如何存储虚函数关系的?如何通过虚函数表分析设计安全性?

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

Peng Gong:我的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--

转----我的算法学习之路

我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 原文链接:http://zh.lucida.me/blog/on-learning-algorithms/ 原文作者:Lucida 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程