简单vector达到
得知c++于,看完这本书后,,最近苦于不知道下一步该怎么做了,在寻找STL在各种容器的源代码分析,我想一次又一次地实现它。
之前,很多问题看的时候不知道是怎么回事,意与理解的。这个vector类写得特别简单,仅仅实现了当中的一部分功能,由于没有使用iterator。发现一些函数不太好写,并且封装性极差。同一时候,仅仅能存放内置类型。在这些问题中,希望自己以后会好好重写一下。
这个程序有点小情况。进行插入操作时,在VC++6.0下执行是正常的,在codeblocks下最后一个数却是乱的,可是在codeblocks下进行调试时又是正常的,前面写了一个关于跳表的程序也是这样,都快疯了,要是有人知道原因,求告知。
Vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cstdlib>
/**
* 实现中仅仅能处理内置类型T
*/ namespace flysnow{
template<class T>
class Vector {
public:
T* start;
T* finish;
T* end_of_storage;
//void alloc
public:
Vector():start(NULL),finish(NULL),end_of_storage(NULL) {}
Vector(size_t n,const T& value);
//Vector(int n,const T& value);
//Vector(long n,const T& value);
explicit Vector(size_t n);
~Vector() {free(start);} //在这里发现得推断是内置类型还是class,这里仅仅支持内置类型
T& front() {return *start;}
T& back() {return *finish;} void push_back(const T& t);
void pop_back();
T* erase(T* position);
T* erase(T* position,size_t n);
void insert(T* pos,size_t n,const T& x);
size_t size() {return finish-start;}
bool empty() {return start == finish;}
void resize(size_t n,const T& x);
void resize(size_t n);
void clear();
size_t capacity() {return end_of_storage-start;}
T& operator[] (size_t index) {return *(start+index);}
T* get_pointer() {return start;}
}; template<class T>
Vector<T>::Vector(size_t n,const T& value)
{
start = (T*)malloc(n*sizeof(T));
finish = start + n;
end_of_storage = finish;
for(size_t i=0; i<n; i++) {
start[i] = value;
}
} template<class T>
Vector<T>::Vector(size_t n)
{
start = (T*)malloc(n*sizeof(T));
finish = start + n;
end_of_storage = finish;
for(int i=0; i<n; i++) {
//start[i] = T();
start[i] = 0;
}
} template<class T>
void Vector<T>::push_back(const T& t)
{
if(end_of_storage != finish) {
*finish = t;
++finish;
} else {
size_t old_size = size();
size_t new_size = old_size? (2*old_size):1;
T* new_start = (T*)malloc(new_size*sizeof(T));
for(size_t i=0; i<old_size; i++) {
*(new_start+i) = *(start+i);
}
*(new_start+old_size) = t;
start = new_start;
finish = start + old_size + 1;
end_of_storage = start + new_size;
}
} template<class T>
void Vector<T>::pop_back()
{
if(empty()) {
return ;
}
--finish;
// finish->~T();
}
template<class T>
T* Vector<T>::erase(T* pos)
{
T* temp = pos;
while(pos != finish-1) {
*pos = *(pos+1);
pos++;
}
--finish;
return temp;
} template<class T>
T* Vector<T>::erase(T* pos,size_t n)
{
T*p = pos+n;
T* result = pos;
if(p >= finish) {
n = finish-pos+1;
erase(pos,n);
} else {
while(p < finish) {
*pos++ = *p++;
}
finish -= n;
}
return result;
} template<class T>
void Vector<T>::insert(T* pos,size_t n,const T& x)
{
size_t i;
size_t old_size = size();
size_t index = pos-start;
if(n <= end_of_storage-finish+1) {
for( i=old_size-1;i>=index;i--) {
start[i+n] = start[i];
}
while(pos <= start+index+n-1) {
*pos++ = x;
} finish += n;
std::cout<<*(finish-1)<<std::endl;
for( i=0;i<size();i++)
std::cout<<start[i]<<' ';
std::cout<<std::endl;
} else {
size_t new_size = old_size;
new_size += old_size>n?old_size:n;
T* new_start = (T*)malloc(new_size*sizeof(T));
for( i=0;i<old_size;i++) {
new_start[i] = start[i];
}
start = new_start;
finish = start + old_size;
end_of_storage = start + new_size;
insert(start+index,n,x);
}
}
template<class T>
void Vector<T>::resize(size_t n,const T& x)
{
size_t old_size = size();
if(n <= old_size) {
erase(start+n,old_size-n);
} else if(n <= capacity()){
for(int i=old_size;i<n;i++) {
start[i] = x;
}
finish = start + n;
} else {
size_t new_size =old_size + old_size > n? old_size:n;
T* new_start = (T*)malloc(new_size*sizeof(T));
for(int i=0;i<old_size;i++) {
new_start[i] = start[i];
}
start = new_start;
finish = start + old_size;
end_of_storage = start + new_size;
resize(n,x);
}
}
template<class T>
void Vector<T>::resize(size_t n)
{
resize(n,0);
}
template<class T>
void Vector<T>::clear()
{
free(start);
start = NULL;
finish = NULL;
end_of_storage = NULL;
} } #endif
main.cpp
#include <iostream>
#include "Vector.h"
using namespace std; int main()
{
flysnow::Vector<int> vec;
vec.push_back(4);
vec.push_back(5);
vec.push_back(9);
vec.push_back(4);
vec.push_back(2);
vec.insert(vec.get_pointer()+2,4,10);
// for(size_t i=0;i<vec.size();i++)
// cout<<vec[i]<<' ';
// cout<<endl;
vec.insert(vec.get_pointer()+1,1,11);
cout<<*(vec.erase(vec.get_pointer()+4,3))<<endl;
// cout<<*(vec.finish-1)<<endl;
for(size_t i=0;i<vec.size();i++)
cout<<vec[i]<<' ';
cout<<endl;
return 0;
}
版权声明:本文博主原创文章。博客,未经同意,不得转载。
简单vector达到的更多相关文章
- 线性表实现简单vector
实现一个简单的vector Vector基于数组实现,可以复制并且其占用的内存可以自动回收(通过析构函数),可以调整Vector的大小,以及容量(容量的改变是通过为基本数组分配一个新的内存块,然后复制 ...
- [C++STL] vector 容器的入门
vector容器的入门 #include<vector> 创建vector容器的几种方式 数据类型可以是结构体,也能是另外一个容器 vector 的初始化: (1) 创建并声明大小 vec ...
- [C++ Primer] : 第10章: 泛型算法
概述 泛型算法: 称它们为"算法", 是因为它们实现了一些经典算法的公共接口, 如搜索和排序; 称它们是"泛型的", 是因为它们可以用于不同类型的元素和多种容器 ...
- C++(二)— STL容器的基本用法
1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...
- heap(堆)
二叉堆: 以前写过二叉堆,但很少使用,快忘了.最近又查了一些关于堆的资料,于是重新熟悉一下这种数据结构. 一个快速又简单的方式建立二叉堆,仅使用简单vector(或者数组也行): #include & ...
- Support Vector Machine (1) : 简单SVM原理
目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...
- 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...
- 【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能 ...
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
随机推荐
- 屌丝程序猿赚钱之道之taobao 2
续上篇,之前写的案例,都是比較0基础的. 案例4: 代写情书.软文.论文等等. 这是我一个同学的真实故事. 我隔壁寝室的小王平时没事就爱谢谢博客.逛逛论坛.大二的时候接触了威客网,開始在网上 ...
- sort 工具总结
sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. -u 去除重复行 -r sort默认的排序方式是升序,如 ...
- 解决backgroud:transparent在低版本浏览器中的bug
今天在html页面上定义了一个button和一个div,大小相同,button使用绝对定位,覆盖在div上面一层,同时样式设置背景透明(background:transparent). 这样就可以在看 ...
- leetcode第一刷_Convert Sorted List to Binary Search Tree
好,二叉搜索树粉末登场,有关他的问题有这么几个,给你一个n,如何求全部的n个节点的二叉搜索树个数?能不能把全部的这些二叉搜索树打印出来? 这道题倒不用考虑这么多,直接转即可了,我用的思想是分治,每次找 ...
- Akka边学边写(3)-- ByteString介绍
Akka的IO层设计能够參考这篇文档,本文简介一下ByteString的设计. Immutable消息 Actor之间是通过消息沟通的.但为了避免同步问题,消息必须是Immutable. 因此.Akk ...
- 两个实验操作系统-ubuntu在安装配置pintos
安前两次莫名其妙, 蛋疼的实验操作系统.. 首先下错了总结第一次. 使用最后gdb调试pintos什么时候, 这个错误将被报告: bochsrc.txt:8: Bochs is not compile ...
- Android onTouch、OnLongClick、onClick和ScrollView滑动事件冲突
为了实现近期录制的长按,松开手指,结束录制功能.在项目,难道你去走一走会头晕,书写demo为了下一个梳理. 顺便研究android事件调用机制. 先上效果界面: 布局: <RelativeLay ...
- windows phone (22) 隐藏元素
原文:windows phone (22) 隐藏元素 在wp中我们也会用到隐藏某个元素,已达到某种效果,刚刚从文章看到了,分享一下[作者:神舟龙] Visibility 此属性能非常方便的实现隐藏某个 ...
- Java学习之路:详细解释Java解析XML四种方法
XML如今已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 对于XML本身的语法知识与技术细节,须要阅读相关的技术文献,这里面包含的内容有DO ...
- kb3035583
dism /online /Get-Packages /Format:Table|findstr 3035583 升级到w10补丁