练习一发,主要是使用placement new在原始内存上创建对象。半路md面试电话来了,赶紧存档,看Java大法

#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm> using namespace std; class Object {
public:
static int count;
public:
int current;
int id;
Object(int i) {
id = i;
current = count++;
cout<<"object["<<id<<"] create : "<<current<<endl;
} ~Object() {
cout<<"object["<<id<<"] destroy: "<<current<<endl;
} Object(const Object& obj) {
current = count++;
id = obj.id;
cout<<"object["<<id<<"] copied : "<<current<<" old : "<<obj.current<<endl;
}
}; int Object::count = ; template<class T>
class MyVector {
public:
typedef T value_type;
typedef value_type* pointer;
typedef value_type* iterator;
typedef value_type& reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type; private:
iterator start;
iterator finish;
iterator space_end;
public:
MyVector() {
start = NULL;
space_end = NULL;
finish = NULL;
} size_type capacity() {return space_end - start;}
size_type size() { return finish - start; } bool empty() { return start == finish; }
iterator begin() {return start;}
iterator end() {return finish;} reference operator[] (int idx) {return start[idx];}
reference front() {return *start;}
reference back() {return *(finish-);} void clear() { } void pop_back() {
if (start >= finish) {
return;
}
finish--;
finish->~T();
} void push_back(const T& x) {
if (finish < space_end) {
// placement new
new (finish) T(x);
// adjust end pointer
finish++;
} else if (space_end == finish){
// space not enough
int olen = finish - start;
int nlen = olen == ? : olen * ;
T* new_start = (T*) malloc(nlen * sizeof(T));
T* new_finish = new_start;
for (int i=; i<olen; i++) {
// copy old data to new space
new (new_finish++) T(*(start + i));
}
// append pushed element
new (new_finish++) T(x); // deconstruct old ones
for (int i=; i<olen; i++) {
(start+i)->~T();
}
free(start); start = new_start;
finish= new_finish;
space_end = start + nlen;
} else {
// state invalid
cerr<<"error"<<endl;
}
} ~MyVector() {
for (T* s=start; s<finish; s++) {
s->~T();
}
free(start);
}
}; #define USE_ORG 0
int main() { long* a = NULL;
long* b = a + ;
int n = (char*)b - (char*)a; cout<<n<<endl; int last_capacity =-;
Object::count = ; #if USE_ORG
vector<Object> tmp;
#else
MyVector<Object> tmp;
#endif for (int i=; i<; i++) {
tmp.push_back(Object(i));
if (last_capacity != tmp.capacity()) {
cout<<"======last cap:"<<last_capacity<<" new capacity:"<<tmp.capacity()<<endl;
last_capacity = tmp.capacity();
} cout<<"\n\n"<<endl;
} MyVector<int> ints;
ints.push_back();
ints.push_back();
ints.push_back(); sort(ints.begin(), ints.end()); for (int i:ints) {
cout<<i<<endl;
} system("pause");
return ;
}

C++ STL:vector实现的更多相关文章

  1. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  2. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  3. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  4. STL vector+sort排序和multiset/multimap排序比较

    由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...

  5. STL vector 用法介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  6. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  7. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  8. C++STL vector详解(杂谈)

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  9. C++ stl vector介绍

    转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...

  10. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

随机推荐

  1. 干货 | Elasticsearch Nested类型深入详解(转)

    https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...

  2. java编码规范_缩进和注释

    1.       缩进排版(Indentation) 4个空格常被作为缩进排版的一个单位.缩进的确切解释并未详细指定(空格 vs. 制表符).一个制表符等于n个空格(视具体的编辑器而定,Eclipse ...

  3. Google 里的软件工程学

    简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组.有很多书籍或文章会从 商业/管理 等非技术角 ...

  4. Keil RTX使用 os_mut_init 报Hard Fault 错误解决记录

    首先确定你的软件是在互斥信号初始化的位置,在以下几个位置,将会报Hard Fault 错误: (1).os_sys_init_user 用户线程创建之前 (2).os_tsk_create_user之 ...

  5. FFmpeg工具使用总结

    . 一. FFmpeg是什么? 简单说,FFmpeg就是一个很好的,免费的,开源的视频转换工具.详细说,FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依 ...

  6. 架构师养成记--24.linux常用命令

    一.Linux 文件 根据上文Linux 文件说明1.文件的rwx    d开头表示文件夹,    -开头的表示文件,    l开头表示链接文件    r:read,w:write,x:execute ...

  7. FCN详解

    转载自:https://www.cnblogs.com/gujianhan/p/6030639.html 论文地址:https://arxiv.org/pdf/1411.4038v1.pdf 背景 C ...

  8. Vue 不睡觉教程3 - 来点实在的:自动计算剩余时间的任务列表

    目标前两课教的是入门和文件结构.都没有什么实在的东西.这次我们要来点实在的.我们要做出一个待办列表.这个待办列表有以下特点: 可以自动从文本中抽取出这件事情的开始时间可以显示当前距离这件事情的开始时间 ...

  9. Mac下Homebrew安装的软件放在什么地方

    一般情况是这么操作的: 1.通过brew install安装应用最先是放在/usr/local/Cellar/目录下. 2.有些应用会自动创建软链接放在/usr/bin或者/usr/sbin,同时也会 ...

  10. java反射机制_读取properties

    代码: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射特点: ...