• 标准库类型之vector


    上篇中遗留了一个小作业,就是用string中的find_first_not_of和find_last_not_of函数来实现字符串左右空格的去除,先来完成它,实现的思路是先来编写去除左空格,然后再编写去除右空格,最后去除左右空格则去调用前面两个方法既可,先来编写一个去除空格的工具类:

    StringUtil.h:

    #ifndef _STRING_UTIL_H_
    #define _STRING_UTIL_H_
    
    #include <string>
    using namespace std;
    
    class StringUtil
    {
    public:
        static void Ltrim(string& s);//去除左空格
        static void Rtrim(string& s);//去除左空格
        static void Trim(string& s);//去除左右空格
    };
    
    #endif

    下面来一一对其进行实现,先来实现去除左空格,如何实现呢?

    这里需要用到string中的一个函数:

    那去除右空格则比较简单了,这里使用erase的另外一种形式:

    那去除左右空格就直接调用上面两个方法既可:

    下面编写测试代码来验证一下:

    下面正式开始vector的学习:

    • vector是同一种类型的对象的集合。
    • vector的数据结构很像数组,能非常高效和方便地访问单个元素。
    • vector是一个类模板(class template)。
    • 要使用vector必须包含相关头文件
      #include <vector>
      using std::vector; 

    【注意】:它的空间是连续的,但是是可以动态扩展的,也叫动态数组,貌似有点矛盾,至于这是怎么实现的,等之后学STL时再来剖析,目前先了解它的使用既可。

    vector类定义了好几种构造函数:

    • vector<T>  v1;//vector保存类型为T的对象。默认构造函数v1为空
    • vector<T> v2(v1);// v2是v1的一个副本
    • vector<T> v3(n, i);//v3包含n个值为i的元素 
    • vector<T> v4(n);//v4含有值初始化的元素的n个副本

    对于string它的类型是basic_string<char>,而vector<T>也是一种类型,它的具体使用如下:

    实际上也可以像string一样将它再定义一下,方便使用:

    接下来往里面添加元素:

    接着如何将添加的元素打印出来呢?

    编译运行:

    有警告,这是为什么呢?

    说明是无符号类型的,所以修改代码:

    编译运行:

    对于这段显示的代码可以提取到一个函数中以便之后使用:

    另外还有其它显示方式:利用迭待器【只要是容器都可以用迭待器】,具体如下:

    #include <vector>
    #include <iostream>
    using namespace std;
    
    typedef vector<int> INTVEC;
    
    //void showVector(const INTVEC& v) {
    //    unsigned int i;
    //    for(i = 0; i < v.size(); i++) {
    //        cout<<v[i]<<" ";
    //    }
    //    cout<<endl;
    //}
    
    void showVector(INTVEC& v) {
        INTVEC::iterator it;//迭待器可以看成是泛型程序指针,什么是泛型未来会学习,了解一下既可
        for(it = v.begin(); it != v.end(); ++it) {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    
    int main(void) {
    
        //vector<int> v;
        INTVEC v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
    
        showVector(v);
    
        return 0;
    }

    关于上面的代码有两个疑点:

    ①、为什么不有<而用!=?

    因为并不是所有的容器都实现了<运算符重载,但是!=是所有容器都实现了的,为了让程序有更好的可移植性,所以需要用!=

    ②、为什么用++it,而不用it++?

    原因是由于性能没有++it好,在学习运算符重载时,我们实现了一个Integer,可以查看一下后置++的实现代码:

    所以为了更加高效,则采用前置++。

    但是最好还是采用常量来显示:

    编译运行:

    这是由于迭待器这时也得换成常量的了,不然就报错了,修改代码如下:

    这时就可正常显示了,但是需要注意的是:这时不能对数据进行修改了,如下这样写是错误的:

    编译:

    在学习这个函数之前,有一个类似的函数,但是两者有巨大的区别,先来看下:

    也就是说back()只是取出最后一个元素,并不会从容器中弹出。

    而如果用pop_back()当然就会弹出喽:

    记得sring中也有这个函数,下面来使用一下:

    编译运行:

    它还有另外一种形式:

    如果想移除容器中值等于某个值的元素,那怎么弄呢?如下:

    编译运行:

    因为这个方法是属于算法的,所以需要包含算法头文件:

    再次编译运行:

    貌似没有将等于3的元素移除呀,remove方法并不能真正移除,它只是让元素进行了移位而已,这是因为还少一步操作,如下:

    再来看结果:

    成功删除,至于为什么能够删除,等之后学到STL之后再来剖析,先学习使用既可,除了利用系统的这个remove方法可以删除之后,还有其它的方式能达到目的么,当然:利用迭待器:

    编译运行:

    这是为啥呢?分析下代码:

    所以需要调整代码了:

    再次编译运行:

    这种方式也同样适用下节要介绍的map容器~

  • 相关阅读:
    java 判断返回值的类型
    使用反射报异常:object is not an instance of declaring class解决方案
    InvocationTargetException 异常
    在MyEclipse下统计工程的代码(package、行数、类个数)
    跨域问题,及解决方案
    封装原生Ajax发送请求
    win10系统,打不开个性化,并且报错找不到指定模块
    jquery删除内容是动态修改序号
    使用jquery实现返回顶部按钮
    jquery监听video标签视频播放暂停状态
  • 原文地址:https://www.cnblogs.com/webor2006/p/5494010.html
Copyright © 2020-2023  润新知