(C++)vector & list 的使用和模拟实现-程序员宅基地

技术标签: C++  c++  迭代器  vector  list  

顺序容器(sequential container)

  • 顺序容器为程序员提供了控制元素储存和访问顺序的能力。
  • 这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。

迭代器

  • 提供对对象的间接访问。
  • 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。
  • 迭代器有 有效和无效之分,
  • 有效的迭代器或指向某个元素,或指向容器中尾元素的下一位置。
  • 其他情况都属于无效。

使用

  • begin(): 负责返回指向第一个元素
  • end():负责返回只想最后一个元素的下一个位置。也就是说,该迭代器指向的是容器一个本不存在的“尾后”(off the end)元素。
  • 特殊情况下,如果容器为空,则begin和end返回的是同一个迭代器。都是尾后迭代器。

vector

特点

  • 可变大小数组。
  • 支持快速随机访问。
  • 在尾部之外的位置插入或删除元素可能很慢。

函数接口

这里写图片描述

使用

代码:

int main()
{
    vector<int>::iterator it;
    vector<int> v1;

    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);

    for (auto it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    v1.pop_back();
    v1.pop_back();
    v1.pop_back();

    for (auto it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    it = v1.begin();
    it = v1.insert(it, 100);

    for (it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    v1.push_back(12);
    v1.push_back(13);
    v1.push_back(14);
    v1.push_back(15);

    for (it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    it = v1.begin();
    v1.erase(it + 3);

    for (it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    vector<int> v2(3, 30);
    vector<int> v3(6, 60);

    for (it = v2.begin(); it != v2.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    for (it = v3.begin(); it != v3.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    v2.swap(v3);
    for (it = v2.begin(); it != v2.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    for (it = v3.begin(); it != v3.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;

    getchar();
    return 0;
}

运行结果:

这里写图片描述

实现

代码:

#include<iostream>
#include<vector>
#include<list>
#include<assert.h>

using namespace std;

template<class T>
class MyVector
{
public:
    MyVector()
        :_data(NULL)
        , _size(0)
        , _capacity(0)
    {}

    MyVector(const MyVector<T> &s)
    {
        _data = new T[s._size];
        for (size_t i = 0; i < _size; ++i)
        {
            _data[i] = s._data[i];
        }
        _size = s._size;
        _capacity = s._capacity;
    }

    ~MyVector()
    {
        if (_data)
        {
            delete[] _data;
            _data = NULL;
            _size = 0;
            _capacity = 0;
        }
    }

    void PushBack(const T& data)
    {
        CheckCapacity
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JS_Evey/article/details/78106910

智能推荐

C++实现简单矩阵函数包_c++上面矩阵计算包-程序员宅基地

使用 python 实现深度学习时, python 中的 NumPy 库高效易用,令人惊艳。但因为刚入门 python ,过于精简的语法反而让我感到不适应,所以想着 C/C++ 是否也存在这样的矩阵处理库,问过度娘后,得到了肯定答案。不过还是总想着自己模仿着写一个矩阵工具,所以就有了这篇文章。ps:如果真的想要使用 C++ 进行科学计算,还是得使用正儿八经的处理库。自己写的也就是写着练练手,什么也做不了。Matrix开发工具:Dev-C++ 5.11使用方法:直接包含头文件 Matrix.h接口_c++上面矩阵计算包

css 之height和min-height_css height无效 min-height有效-程序员宅基地

小记height:100%和min-height:100%height和min-height的设置为100% ,其高度是根据父盒子height真实有效的高度而得到高度。否则就是auto注意: 其中。如果父盒子使用了min-height:100%而没有设置height,这个时候子元素的高度是auto。..._css height无效 min-height有效

浅析spinlock_spin_lock中断_~kiss~的博客-程序员宅基地

自旋这块是借鉴其他博主的,但找不到是哪个的了,找到之后补上【被保护的资源在进程上下文、软中断上下文】如果被保护的共享资源只在进程上下文访问和软中断上下文访问,那么当在进程上下文访问共享资源时,可能被软中断打断,从而可能进入软中断上下文来对被保护的共享资源访问,因此对于这种情况,对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护。实验:(1)先让普通进程kthread先跑起来,再让timer软中断在同一个CPU去执行handler,看能否抢占成功(2)先让普_spin_lock中断

爪哇国新游记之二十八----从url指定的地址下载文件到本地-程序员宅基地

package download;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.URL;import java.net.URLConnection;import j...

计算机网络什么是互联网什么是网速,网速慢是什么原因,怎么解决?-程序员宅基地

原标题:网速慢是什么原因,怎么解决?电脑网络速度慢,网络卡、下载速度慢,视频播放不流畅的原因是什么呢?我们又应该如何解决?今天,就让我们来看看如何解决网络速度慢的问题! 提升网络速度限制网络受到限制,是电脑网络速度较慢的原因之一,因此我们可以解除网络速度限制。1.通过组合键[win + R]打开[运行],输入[gpedit.msc]进入本地组策略组编辑器 2.依次点击[管理模板]、[网络]、[Qo...

第84天:jQuery动态创建表格-程序员宅基地

jQuery的动态创建表格 1 &lt;!DOCTYPE html&gt; 2 &lt;html lang="en"&gt; 3 &lt;head&gt; 4 &lt;meta charset="UTF-8"&gt; 5 &lt;title&gt;动态创建表格&lt;/title&gt; 6 &lt;script src=&q

随便推点

20150812-如何在IAR中通过Watch窗口观察局部变量的值-程序员宅基地

原文地址:http://www.cnblogs.com/wx865220862/archive/2013/03/27/2984168.html 最近在用430开发一款产品,在软件调试的时候发现Watch窗口中无法观察局部变量的值,总是显示,下面通过一个简答的例子说明一下现象:#include "msp430g2553.h"/* Global variable */unsigned char Re

多任务—进程/队列-程序员宅基地

程序可以理解为一个代码,它是静态的,存储在硬盘中,不占用资源,程序运行起来,就是进程,进程消耗资源,占用内存中,进程也可以完成多任务。进程耗费资源较多。创建进程通过 import multiprocessingP1=multiprocessing.Process(target)P1.start()来创建进程当主进程运行到P1.start()时,会创建子进程,有n个 实例对象.sta...

如何彻底删除快压广告_如何清理快压广告-程序员宅基地

可以看下面的教程https://jingyan.baidu.com/article/64d05a020569b0de54f73b53.html_如何清理快压广告

知识融合中几种计算文本相似度的方法(代码)_融合相似度计算公式_阿拉辉的博客-程序员宅基地

1.余弦相似度import numpy as npimport jieba#读取停用词def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords# 加载停用词stopwords = stopwordslist("cn_stopwords.txt")def cosi_融合相似度计算公式

Android开发之RecyclerView的不同position加载不同View详解_android recyclerview getitemviewtype-程序员宅基地

Android开发之RecyclerView的不同position加载不同View详解近日做项目,使用RecyclerView控件来显示数据,然而,在使用过程中,需要在不同的position设置不同的布局,该怎么办呢???不要着急,经本人的一番研究后,终于实现了其基本功能,现将代码贴出,还望各位大神批评指正,不喜勿喷,灰常感谢O(∩_∩)O哈哈~核心思想:1_android recyclerview getitemviewtype

oracle 11g rman init,oracle 11g dg 部署rman方式要点记录-程序员宅基地

1、环境介绍iphostnamesiddb_namedb_unique_namenet service name192.168.56.118oraclepyunhaipyunhaipyunhaipyunhaip192.168.56.117oraclesyunhaipyunhaipyunhaisyunhais2、修改hostnamehostnamectl set-hostname oraclep3、..._rman-04006 ora-12528