练习一发,主要是使用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. 终于搞定在VS2010中将CString转换为const char*

    最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...

  2. POJ3460 Booksort(IDA*)

    POJ3460 Booksort 题意:给定一个长度为n的序列,每次可以取出其中的一段数,插入任意一个位置,问最少需要几次操作才能使整个序列变为1~n 思路:IDA*+迭代加深搜索 小技巧:将一段数插 ...

  3. You need to use a Theme.AppCompat theme (or descendant) with this activity问题

    You need to use a Theme.AppCompat theme (or descendant) with this activity问题 https://blog.csdn.net/j ...

  4. 汉诺塔的python 动画演示

    1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...

  5. Could not parse UiSelector argument: 'XXX' is not a string 错误解决办法

    ebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR,new UiS ...

  6. 【性能测试】:操作NMON的shell脚本

    nmon是监控服务器的一个工具,可以自动生成快照,每次执行命令就可以了 这里写了一个小的shell脚本,练习一下 #!/bin/sh OSType=`uname` #判断系统类型,选择不同命令 if ...

  7. jquery中ajax使用error调试错误的方法,实例分析了Ajax的使用方法与error函数调试错误的技巧

    代码:$(document).ready(function() { jQuery("#clearCac").click(function() { jQuery.ajax({ url ...

  8. Mac下关闭Sublime Text 3的更新检查

    操作如下: 注意:update_check的属性前后都要有一个逗号. , "update_check":false, 然后还需要一步,就是注册破解,在[Help]->[Ent ...

  9. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  10. hadoop-2.6.0-cdh5.4.5.tar.gz(CDH)的3节点集群搭建(含zookeeper集群安装)

    前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接 http://www.cnblogs.com/zlslch/p/ ...