【Algorithm】连续线性表模拟实现vector功能

2023-05-16

Cmakelists:

cmake_minimum_required(VERSION 3.21)
project(sequential_storage_list)

set(CMAKE_CXX_STANDARD 17)

add_executable(sequential_storage_list main.cpp)

Code:

#include <iostream>
#include <stdexcept>

class SeqList {
private:
    int* arr;
    int capacity;
    int length;
public:
    explicit SeqList(int capacity = 10) {
        this->arr = new int[capacity];
        this->capacity = capacity;
        this->length = 0;
    }
    ~SeqList() { delete[] arr;}

    int& operator[](int index) {
        if (index >= length || index < -length) {
            throw std::out_of_range("Index out of range");
        }
        if (index < 0) {
            index += length;
        }
        return arr[index];
    }
    const int& operator[](int index) const {
        if (index >= length || index < -length) {
            throw std::out_of_range("Index out of range");
        }
        if (index < 0) {
            index += length;
        }
        return arr[index];
    }

    int size() const {return length;}

    void push_back(int value) {
        if (length == capacity) {
            resize(2 * capacity);
        }
        arr[length++] = value;
    }

    void insert(int index, int value) {
        if (index > length || index < -length) {
            throw std::out_of_range("Index out of range");
        }
        if (index < 0) {
            index += length;
        }
        if (length == capacity) {
            resize(2 * capacity);
        }
        for (int i = length - 1; i >= index; --i) {
            arr[i + 1] = arr[i];
        }
        arr[index] = value;
        ++length;
    }

    void erase(int index) {
        if (index >= length || index < -length) {
            throw std::out_of_range("Index out of range");
        }
        if (index < 0) {
            index += length;
        }
        for (int i = index + 1; i < length; ++i) {
            arr[i - 1] = arr[i];
        }
        --length;
    }

    int pop_back() {
        if (length == 0) {
            throw std::out_of_range("List is empty");
        }
        int value = arr[length - 1];
        --length;
        return value;
    }

    void clear() {length = 0;}

    // 查找指定值在链表中的索引,如果不存在则返回-1
    int find(int value) const {
        for (int i = 0; i < length; ++i) {
            if (arr[i] == value) {
                return i;
            }
        }
        return -1;
    }

    // 修改指定索引位置的值
//    void modify(int index, int value) {
        if(index>=0 && index<length){
//            arr[index] = value;
        }
//    }

private:
    void resize(int new_capacity) {
        int* new_arr = new int[new_capacity];
        for (int i = 0; i < length; ++i) {
            new_arr[i] = arr[i];
        }
        delete[] arr;
        arr = new_arr;
        capacity = new_capacity;
    }
};

int main() {
    SeqList list(10);
    std::cout << "Initial size: " << list.size() << std::endl;
    for (int i = 0; i < 10; ++i) {
        list.push_back(i + 1);
    }
    std::cout << "After push_back: ";
    for (int i = 0; i < list.size(); ++i) {
        std::cout << list[i] << " ";
    }
    std::cout << std::endl;

    // 测试查找功能
    int value_to_find = 5;
    int index = list.find(value_to_find);
    if (index == -1) {
        std::cout << value_to_find << " not found" << std::endl;
    } else {
        std::cout << value_to_find << " found at index " << index << std::endl;
    }

    // 测试修改功能
//    int index_to_modify = 2;
//    int new_value = 99;
//    list.modify(index_to_modify, new_value);
//    std::cout << "After modify: ";
//    for (int i = 0; i < list.size(); ++i) {
//        std::cout << list[i] << " ";
//    }
//    std::cout << std::endl;

    list.erase(4);
    std::cout << "After erase: ";
    for (int i = 0; i < list.size(); ++i) {
        std::cout << list[i] << " ";
    }
    std::cout << std::endl;
    int value = list.pop_back();
    std::cout << "Pop back value: " << value << std::endl;
    std::cout << "After pop_back: ";
    for (int i = 0; i < list.size(); ++i) {
        std::cout << list[i] << " ";
    }
    std::cout << std::endl;
    list.clear();
    std::cout << "After clear: ";
    for (int i = 0; i < list.size(); ++i) {
        std::cout << list[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}


//万能引用(也称为右值引用)是C++11中一个重要的特性之一,其使用方式是在类型前加上&&。

万能引用(也称为右值引用)是C++11中一个重要的特性之一,其使用方式是在类型前加上&&。

它允许程序员编写通用代码,能够处理各种类型的左值和右值,同时还能避免不必要的拷贝操作,提高了代码的性能和效率。

当使用万能引用时,编译器会对传入的参数类型进行推导,并将其转换为正确的类型。如果传递的是左值,则编译器会自动将其变成一个右值引用,这样就可以避免多余的拷贝操作,提高代码效率。

下面是一个示例代码:


template<typename T>
void foo(T&& t) {
    // 这里的t会被自动推导为左值引用或右值引用
}

在这个示例中,T&&表示一个万能引用,它可以接受任意类型的参数,并将其传递给函数体中的变量t。根据传入的参数不同,t的类型可能是左值引用或右值引用。通过使用万能引用,我们可以编写更加通用和灵活的代码,提高代码的可复用性和效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Algorithm】连续线性表模拟实现vector功能 的相关文章

  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • LibGDX 将 Vector2 与浮点值相乘

    有没有办法将 Vector2 与浮点值相乘 我曾经在 XNA 中这样做 通过将归一化方向向量与速度浮点数相乘来计算运动 这几乎是我的代码中使事情正常工作的最后一步 但似乎没有用于接受浮点值的 Vector2 的乘法函数 我可以手动将 x 和
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 按常量 id 对自定义类型的向量进行排序

    我需要对自定义类型的向量进行排序std vector
  • 3D 数组到 3D std::vector

    我在代码函数中用 3D std vector 替换了 3D 数组 它进入了无限循环 你能给我一个提示吗 我真的需要使用向量而不是数组 谢谢 我最初的代码是 arr is a 3D array of a sudoku table the 3
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • 在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN),有些来源引用 O(h)?

    在研究遍历二叉搜索树的任何算法的复杂性时 我看到两种不同的方式来表达同一件事 版本 1 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O h 版本 2 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O logN
  • 颜色逻辑算法

    我们正在构建一个体育应用程序 并希望将团队颜色融入到应用程序的各个部分 现在 每个团队都可以使用几种不同的颜色来表示 我想做的是执行检查以验证两个团队颜色是否在彼此一定的范围内 这样我就不会显示两个相似的颜色 因此 如果团队 1 的主要团队
  • 在一个区域中拟合二维多边形的算法?

    这有标准吗 算法名称 说 我有 10 个不同大小的多边形 我有一个特定大小的区域 我想知道如何填充该区域中的最多多边形 以及它们是如何拟合的 笔记 多边形可以根据限制集进行旋转 一个可能的名称是包装问题 http en wikipedia
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 寻找公共子集的算法

    I have N number of sets Si of Numbers each of a different size Let m1 m2 mn be the sizes of respective sets mi Si and M

随机推荐

  • 我的ubuntu配置之旅

    需求 我想脱离鼠标我想快速的在窗口之间切换我想有效的进行窗口分类 方案 涉及Ubuntu自带概念workspace xff0c Alt 43 tab 窗口切换快捷键思路是利用workspace对app进行分类 xff0c alt 43 ta
  • 去除多余的Merge branch提交

    去除多余的Merge branch提交 在项目开发中 xff0c 经常会有这样的情况发生 xff0c 开发完了一个新功能 xff0c 提交到远程仓库时 xff0c 发现提交失败 xff08 其他同事已对其做了更改 xff09 xff0c 先
  • 5 Ways To Fix Slow 802.11n Speed

    http www cnblogs com jjkv3 archive 2012 04 22 2464919 html o you went and bought a shiny new 802 11n router and were all
  • Linux IPC总结(全)

    IPC进程间通信 Inter Process Communication 就是指多个进程之间相互通信 xff0c 交换信息的方法 Linux IPC基本上都是从Unix平台上继承而来的 主要包括最初的Unix IPC xff0c Syste
  • 升级WEXT到NL80211/CFG80211

    内容包括 xff1a 1 分析两者的区别 2 分析两者的架构 xff0c 重点在后者 3 如何将在WE架构中用到的standard和private的command在新的架构中实现 请等待
  • Zebra-VTYSH源码分析和改造(三):添加定制命令

    一 视图介绍 由上面几篇文章分析可见 xff0c 所有的命令都是包含在node中的 xff0c 根据Cisco或者H3常见路由器或者交换机的CLI格式可见 xff0c 一个node就对应着一个视图 xff08 View xff09 常用的视
  • Bringup wifi driver to android 6.0

    1 android root system core rootdir init rc mkdir data misc systemkeys 0700 system system mkdir data misc wifi 0770 wifi
  • [简单总结] WiFi中的RTS和CTS简单回顾

    通信协议中的RTS CTS协议 xff1a 即请求发送 允许发送协议 xff0c 相当于一种握手协议 xff0c 主要用来解决 34 隐藏终端 34 问题 34 隐藏终端 34 xff08 Hidden Stations xff09 是指
  • 【OpenCV】 2D-2D:对极几何算法原理

    2D 2D匹配 对极几何 SLAM十四讲笔记1 1 1 对极几何數學模型 考虑从两张图像上观测到了同一个3D点 xff0c 如图所示 我们希望可以求解相机两个时刻的运动 R t R t R t 假设我们要求取两帧图像
  • 蓝牙技术谈之跳频技术(一)

    跳频技术 Frequency Hopping Spread Spectrum xff1b FHSS 在同步 且同时的情况下 xff0c 接收两端以特定型式的窄频载波来传送讯号 xff0c 对于一个非特定的接收器 xff0c FHSS所产生的
  • 女生应该选JAVA还是前端?

    纵观现阶段互联网web前端开发工程师的就业人员 xff0c 女孩子从事这个行业的比例不大 xff0c 由于这种想象的存在 xff0c 当有女孩说想要学习web前端开发 xff0c 想成为一个牛逼的程序员的时候 xff0c 很多不一样的声音就
  • 在VNC中Xfce4中Tab键失效的解决方法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 在Ubuntu Server 14 04上安装了xfce4桌面环境 xff0c 但是却发现 在终端中Tab键不能自动补齐
  • 浏览器网页视频怎么快速下载到本地?

    我们在浏览网页时 xff0c 经常会遇到一些特别喜欢的视频文件 xff0c 想要下载收藏却苦于不会操作怎恶魔办呢 xff1f 这时候可以通过一些小插件快速达成下载 xff0c 比如通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件 x
  • [golang]-interface转string

    导语 xff1a 使用将gitlab中某个项目的分支提取出来后返回的是interface类型 希望转换成string后存入数据库 interface 转 string 代码是抄来的 xff5e Strval 获取变量的字符串值 浮点型 3
  • [问题已处理]-linux在关机前执行脚本

    导语 xff1a 需要在关机和重启前执行一下关机前的脚本 避免某些服务没有正常关闭导致的问题 xff0c 或者某些服务关闭慢的问题 创建 lib systemd system cleanup service Unit Description
  • [linux]-ubuntu使用ufw及相关配置

    导语 xff1a 记录一下ufw的使用方式以及规则配置文件的更改 UFW配置文件 虽然可以通过命令行添加简单的规则 xff0c 但有些时候也需要添加或删除更加高级或特定的防火墙规则 在运行通过终端输入的规则之前 xff0c UFW会首先运行
  • dependencyManagement与dependencies区别

    dependencyManagement与dependencies区别 最近在阅读maven项目代码时 xff0c dependencyManagement与dependencies之间的区别不是很了解 xff0c 现通过项目实例进行总结
  • Linux-Day2_(包含软件)防火墙配置_软件安装_项目部署_虚拟机克隆_镜像还原

    Linux Day02 软件安装 soft https www aliyundrive com s 8ybAVk3nwhL 点击链接保存 xff0c 或者复制本段内容 xff0c 打开 阿里云盘 APP xff0c 无需下载极速在线查看 x
  • gnome菜单图标显示

    国产操作系统deepin uos都是gnome为基础的 xff0c 默认菜单里面不显示图标 这是因为他们基础gnome xff0c 而GNOME 从2 28之后 xff0c 按钮和菜单中的图标默认不再显示 如果要显示 xff0c 可以使用下
  • 【Algorithm】连续线性表模拟实现vector功能

    Cmakelists span class token function cmake minimum required span span class token punctuation span VERSION span class to