• STL学习笔记之容器


    首先我们要学习的是容器

    第一个是容器的初始化(构造方式)有三种方式

    分别是

    第一种

    int arr[]={1,2,3}

    vector v1(arr,arr+3)

    即容器存放的种类和从另外一个数组去拷贝一段数据。

    第二种

    vector v2(3,10);

    第一个3是指存放的进入容器的个数

    第二个10是存进容器的值。

    第三种

    vector v3(v1);

    直接将其他容器拷贝过来。

    然后我们要了解容器的赋值方法

    第一种

    vector.assign(beg,end)左闭右开

    例如

    int arr[]={1,2,3}

    vector.assign(arr,arr+3);

    那么容器就会装载1,2.

    之所以要左闭右开。是因为一个容器的结尾并不是这个容器的最后一个元素,而是元素的后一位。

    所以vector.begin()是指的容器的第一位。vector.end()是容器的n+1位(n指元素个数)

    那么这样vector.assign(v1.begin(),v2.end())就会拷贝中v2这个容器中的所有元素。

    vector.assign(n,elem)

    例如vector.assign(3,10);

    同构造容器,不再赘述。

    第三种vector.swap()

    例如v2.swap(v1);就会将v1,v2的内容进行交换。

    然后我们要讲的就是容器的大小

    首先是

    vector,size()那么返回值就是这个中元素的个数。(int类型)

    第二个

    vector.empty()。这个将会返回bool值,如果容器为空将会返回ture,否则会返回false

    第三个

    vector.resize(num);重新指定容器的大小,如果容器变长则会用默认值进行填充,如果变短则会自动删除超出容器大小的值。

    第四个

    vector.resize(num,elem)。这个地方就是把默认值替换为elem。规则相同。

    容器的访问

    vector[]进行访问就可以了,类比数组。

    或者vec.at()。一样的是传入位置即可。

    但是如果使用vec.at()出现越界会抛出out_of_range异常。

    而vec[]会直接报错。但是区别不大。

    接下来是容器的插入

    vector.insert(pos,elem);

    这个会在pos位置插入elem元素的拷贝,并且返回新数据的位置。

    vector.insert(pos,n,elem);

    在pos位置插入n个elem数据,无返回值

    vector.insert(pos,beg,end);

    注意Pos是对应位置的指针即vector.insert(v1.begin()+3,elem);

    在pos位置插入beg到end区间的数据(前闭后开),无返回值。

    然后就是对容器的末尾进行增删的操作。

    vector.push_back(num)和vector.pop_back();即可

    接下来我们来学习迭代器

    首先迭代器的作用,可以减少容器的越界访问。

    再就是迭代器的构造

    vector::iterator it;

    it=v1.begin();

    cout << *it;通过*就可以实现对迭代器指向的元素进行访问和操作。

    然后我们来学习迭代器的失效

    vector.insert(it,8)由于容器的存储可能会整体搬迁,那么就可能导致迭代器的失效

    在这里由于insert()可以返回插入的值的新的位置。

    所有it=vector.insert(it,8);可以避免这个问题。

    另外一种就是删除元素也有可能导致的迭代器失效。

    vector::iteretor it2;

    it2=v1.erase(it);

    这个时候由于已经erase(it),系统会默认迭代器已经失效了。从而再次使用的时候会报错。

    同理如果用it=v1.erase(it);就会重新使得迭代器有效,就可以避免这种问题的出现。

  • 相关阅读:
    origin作图上下对开,修改颜色
    Covalent Network(CQT)构建 Web3 最大的结构化数据集,开拓AI、安全性和数据质量的融合
    linux 环境 安装和启动docker
    玩转亚马逊 AWS IoT(2): IoT 控制台使用与开发操作文档
    YC-Framework版本更新:V1.0.9
    缓存设计的创新之旅:架构的灵魂之一
    rust包
    【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数
    关于我对axios的源码理解
    Linux Shell 基础语法 流程控制 逻辑运算 字符串操作详细解析
  • 原文地址:https://blog.csdn.net/qq_35639854/article/details/133484290