数据结构One_Vector(向量的简单实现)

  1 #include <iostream>
  2 using namespace std;
  3
  4 template<typename Object>
  5 class  Vector
  6 {
  7 private:
  8     int theSize;                         //实际数据大小
  9     int theCapacity;                     //实际容器容量大小
 10     Object *objects;                     //基本数组
 11 public:
 12     enum { SPACE_CAPACITY = 16 };        //默认容量大小
 13
 14     explicit Vector(int initSize = 0)    //单参数构造函数要用explicit()避免类型在后台转换
 15         : theSize(initSize), theCapacity(initSize + SPACE_CAPACITY) {
 16         objects = new Object[theCapacity];
 17     }
 18     Vector(const Vector& rhs) : objects(NULL) {    //复制构造函数--调用operator=对已有的Vector进行复制
 19         operator = (rhs);
 20     }
 21     ~Vector() {
 22         delete[] objects;
 23     }
 24
 25     const Vector& operator = (const Vector& rhs) //重载赋值运算符
 26     {
 27         if (this != &rhs)                        //避免复制自身--混淆检验
 28         {
 29             delete []objects;                    //删除旧的内存空间
 30             theSize = rhs.size();                //生成同样的样本大小
 31             theCapacity = rhs.theCapacity;       //生成同样的容量大小
 32
 33             objects = new Object[capacity()];    //生成与所复制的Vector同样容量的新数组
 34             for (int k = 0; k < size(); k++)
 35                 objects[k] = rhs.objects[k];
 36         }
 37         return *this;
 38     }
 39
 40     void resize(int newSize)
 41     {
 42         if (newSize > theCapacity)        //重置大小
 43             reserve(newSize * 2 + 1);     //新大小
 44         theSize = newSize;
 45     }
 46
 47     void reserve(int newCapacity)
 48     {
 49         if (newCapacity < theSize)        //至少和(样本大小)一样大
 50             return;
 51
 52         Object *oldArray = objects;       //oldArray--用于复制旧数组内容
 53         objects = new Object[newCapacity];
 54         for (int k = 0; k < theSize; k++)
 55             objects[k] = oldArray[k];
 56
 57         theCapacity = newCapacity;
 58         delete []oldArray;
 59     }
 60
 61     Object& operator[] (int index)
 62     {
 63         return objects[index];
 64     }
 65     const Object& operator[] (int index) const
 66     {
 67         return objects[index];
 68     }
 69
 70     bool empty() const {
 71         return size() == 0;
 72     }
 73
 74     int size() const {
 75         return theSize;
 76     }
 77     int capacity() const {
 78         return theCapacity;
 79     }
 80     void push_back(const Object& x) {
 81         if (theSize == theCapacity)
 82             reserve(2 * theCapacity + 1);
 83         objects[theSize++] = x;
 84     }
 85
 86     void pop_back() {
 87         theSize--;
 88     }
 89     const Object& back() const {
 90         return objects[theSize - 1];
 91     }
 92
 93     typedef Object *iterator;
 94     typedef const Object *const_iterator;
 95
 96     iterator begin() {
 97         return &objects[0];
 98     }
 99     const_iterator begin() const {
100         return &objects[0];
101     }
102     iterator end() {               //尾后的不存在的指针
103         return &objects[size()];
104     }
105     const_iterator end() const {
106         return &objects[size()];
107     }
108 };
109
110 int main()
111 {
112     Vector<int> test;
113     int data;
114     while (cin >> data)
115     {
116         test.push_back(data);
117     }
118     Vector<int>::iterator it;
119     for (it = test.begin(); it != test.end(); ++it)
120         cout << *it << " ";
121     cout << endl;
122     cout << "pop_one.....\n";
123     test.pop_back();
124     cout << test.back() << endl;
125     return 0;
126 }
时间: 2024-10-16 09:58:07

数据结构One_Vector(向量的简单实现)的相关文章

数据结构与算法分析之简单排序算法

在排序算法中,简单排序主要有三种,分别为冒泡排序.选择排序.插入排序,学习理解好这三种排序算法有助于进一步研究数据结构与算法分析.下面,简单地谈一谈冒泡排序.选择排序.插入排序的原理及区别. 冒泡排序原理: 1.比较相邻的元素.如果前一个比后一个大,它们就交换. 2.每对元素都要进行同样的动作,从后往前比较. 3.每趟都会确定一个位置的元素,因此n个元素,需要n-1趟才能确定各个元素的位置. 例如:对23,4,56,11四个数进行冒泡排序. 第一趟 4,23,11,56 第二趟 4,11,23,

基线系统需要受到更多关注:基于词向量的简单模型

最近阅读了<Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms>这篇论文[1],该工作来自杜克大学,发表在ACL 2018上.论文详细比较了直接在词向量上进行池化的简单模型和主流神经网络模型(例如CNN和RNN)在NLP多个任务上的效果.实验结果表明,在很多任务上简单的词向量模型和神经网络模型(CNN和LSTM)的效果相当,有些任务甚至简单模型更好.下

[您有新的未分配科技点]计算几何入门(1):点,向量以及向量的简单应用

在打了一阵数据结构之后,老师表示"今天晚上让学长给你们讲一下计算几何"--然后就死了.jpg 昨天晚上一直在推数学的式子以及回顾讲课的笔记--计算几何特点就是多而杂,即使是入门部分也是如此-- 首先,我们从二维的几何问题开始处理. 我们知道,高中解析几何计算几何的基础是向量(Vector)和点(Point),所以我们先来表示这两个概念: 在计算几何中,点和向量一般用结构体来存储,像这样: 1 struct Point 2 { 3 double x,y,rad; 4 Point(doub

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

数据结构:稀疏矩阵的简单运算

最近专业课比较多,没怎么看数据结构了.今天有点时间写了一下数据结构中稀疏矩阵的运算.写过之后感觉代码的构思不太好.这里先发一下, 假期的时候再重新实现一下. SpMatrix头文件 1 //The sparse matrix's header file 2 //the class SpMatrix 3 //Author: 'Karllen' 4 //Date:05/28/2014 5 6 #ifndef _SpMatrix_H_ 7 #define _SPMatrix_H_ 8 #include

Java数据结构和算法(三)——简单排序

单单有数据还不够,对于数据的展现,经常要按照一定的顺序进行排列,越高要求的排序越复杂,这篇只介绍三种大小的简单排序. 1)冒泡排序 模拟:有数组,1,4,2,5,7,3. (1)首先从1开始冒泡,1比4小,不冒,4大于2,冒上去,与2交换位置,4比5小,不冒,7比3大,冒,结果:1,2,4,5,3,7 (2)接下来从2开始,因为第一个元素冒过了,重复(1),结果:1,2,4,3,5,7 (3)从第三位4开始,结果1,2,3,4,5,7 (4)虽然看起来已经排好序,但是还是要继续冒,接下来就是从第

算法与数据结构基础3:简单单链表List类的实现

简单的单链表实现,数据类型定义成了int,如果要通用,需要改成模板类,然后稍微修改下就可以了. // List.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class List { public: // ************************************************************************** //

Redis数据结构(一)简单动态字符串

Redis的字符串采用的是自定义的struct,名字叫做简单动态字符串(simple dynamic string,SDS). 结构如下: struct sdshdr{ int len; int free; char buf[]; }; 采用如此结构的好处是: [1]获取length的时候复杂度为O(1),不需要O(n): [2]动态分配空间,避免缓冲区溢出,避免每次修改或者append都重新分配: [3]二进制安全: 关于第一点显而易见,第二点,为了减少修改字符串带来的内存重分配次数,redi

大话数据结构——使用栈实现简单的四则运算

最近在读<大话数据结构>,里面有个例子是使用栈实现四则运算,现在我用java把这个功能实现试试 代码如下: package com.datastruct; import java.util.ArrayList; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StackPractice { private static ArrayList&l