// StlTest1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <vector>
#include <algorithm>
#include <iostream> using namespace std; template <typename T>
class print {
public:
void operator()(const T& elem) {
cout << elem << ' ';
}
}; void TmpObjectTest() {
int ia[6] = { 0,1,2,3,4,5 };
vector<int> iv(ia, ia+6);
for_each(iv.begin(), iv.end(), print<int>());
std::cout << std::endl;
}
//=================================================
template <typename T>
class testClass {
public:
static const int _datai = 5;
static const long _datal = 3L;
static const char _datac = 'c';
}; void InClassInit() {
std::cout << testClass<int>::_datai << std::endl;
std::cout << testClass<int>::_datal << std::endl;
std::cout << testClass<int>::_datac << std::endl;
}
//==============================================
class INT {
friend ostream& operator<<(ostream& os, const INT& i);
public:
INT(int i) :m_i(i) {};
INT& operator++() {
++(this->m_i);
return *this;
} const INT operator++(int) {
INT temp = *this;
++(*this);
return temp;
} INT& operator--() {
--(this->m_i);
return *this;
} const INT operator--(int) {
INT temp = *this;
--(*this);
return temp;
} int& operator*() const {
return (int&)m_i;
} private:
int m_i;
}; ostream& operator<<(ostream& os, const INT& i) {
os << "[" << i.m_i << "]";
return os;
} void OperatorOverloading() {
INT I(5);
cout << I++;
cout << ++I;
cout << I--;
cout << --I;
cout << *I;
} //==================================================
int main()
{
TmpObjectTest();
InClassInit();
OperatorOverloading();
return 0;
}

  

// StlTest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
//测试 class template 拥有 static data members。 #include <iostream>
using namespace std; template <typename T>
class testClass {
public:
static int _data;
static T _td;
}; int testClass<int>::_data = 1;
int testClass<int>::_td = 2;
char testClass<char>::_td = 66; void StaticTemplateMemberTest() {
std::cout << testClass<int>::_data << std::endl;
std::cout << testClass<int>::_td << std::endl;
std::cout << testClass<char>::_td << std::endl;
} //==========================================
template <class I,class O>
struct testClass1 {
testClass1() { std::cout << "I,O" << std::endl; }
}; template <class T>
struct testClass1<T*, T*> {
testClass1() { std::cout << "T*,T*" << std::endl; }
}; template <class T>
struct testClass1<const T*, T*> {
testClass1() { std::cout << "const T*,T*" << std::endl; }
}; void ClassPartialSpecTest() {
testClass1<int, char> obj1;
testClass1<int*, int*> obj2;
testClass1<const int*, int*> obj3;
}
//============================================
class alloc1 {}; template <class T,class Alloc=alloc1>
class vector1 {
public:
void swap1(vector1<T, Alloc>&) { cout << "swap()" << endl; }
}; template <class T,class Alloc1>
void swap1(vector1<T, Alloc1>& x, vector1<T, Alloc1>& y) {
x.swap1(y);
} void FuncTmplPartialOrder() {
vector1<int> x, y;
swap1(x, y);
}
//=============================================
class alloc2{}; template <class T,class Alloc2=alloc2>
class vector2 {
public:
typedef T value_type;
typedef value_type* iterator; template <class I>
void insert(iterator position, I first, I last) {
std::cout << "insert()" << std::endl;
}
}; void MemberTemplates() {
int ia[5] = { 0,1,2,3,4 };
vector2<int> x;
vector2<int>::iterator ite = NULL;
x.insert(ite, ia, ia + 5);
}
//=============================================
class alloc3{}; template<class T,class Alloc3 = alloc3,size_t BufSiz = 0>
class Deque3 {
public:
Deque3() { cout << "deque" << endl; }
}; template <class T, class Sequence = Deque3<T>>
class stack3 {
public:
stack3() { cout << "stack" << endl; }
private:
Sequence c;
}; void LimitDefaultTemplate() {
stack3<int> x;
}
//============================================
class alloc4 {}; size_t __deque_buf_size(size_t n, size_t sz) {
return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
} template <class T,class Ref,class Ptr,size_t BufSiz>
struct __deque_iterator {
typedef __deque_iterator<T, T&, T*, BufSiz> iterator;
typedef __deque_iterator<T, const T&, const T*, BufSiz> const_iterator;
static size_t buffer_size() { return __deque_buf_size(BufSiz, sizeof(T)); }
}; template <class T,class Alloc4 = alloc4,size_t BufSiz = 0>
class deque4 {
public:
typedef __deque_iterator<T, T&, T*, BufSiz> iterator;
}; void NonTypeTmplParamBug() {
cout << deque4<int>::iterator::buffer_size() << endl;
cout << deque4<int, alloc4, 64>::iterator::buffer_size() << endl;
} //=============================================
int main()
{
StaticTemplateMemberTest();
ClassPartialSpecTest();
FuncTmplPartialOrder();
MemberTemplates();
LimitDefaultTemplate();
NonTypeTmplParamBug();
return 0;
}

  

stl源码分析de练习的更多相关文章

  1. STL源码分析《4》----Traits技术

    在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 cla ...

  2. STL源码分析《3》----辅助空间不足时,如何进行归并排序

    两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在  ...

  3. STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort

    最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序 ...

  4. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  5. STL 源码分析《2》----nth_element() 使用与源码分析

    Select 问题: 在一个无序的数组中 找到第 n 大的元素. 思路 1: 排序,O(NlgN) 思路 2: 利用快排的 RandomizedPartition(), 平均复杂度是 O(N) 思路 ...

  6. stl源码分析之allocator

    allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocat ...

  7. STL源码分析与实现-stl_list容器

    1. stl_list 介绍 今天我们来总结一下stl_List, 通过之前介绍单链表的文章,其实对链表的基本操作已经十分熟悉了,那对于stl_list,无非就是链表结构不一样,至于其中的增删改查的细 ...

  8. STL 源码分析六大组件-allocator

    1. allocator 基本介绍 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器(vector,list,map等)内存的分配和释放.C ++标准库提供了默认使 ...

  9. STL源码分析之迭代器

    前言 迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator-&g ...

随机推荐

  1. TypeScript学习笔记(八) - 声明文件

    本篇将介绍TypeScript的声明文件,并简单演示一下如何编写和使用声明文件.本篇也是这个系列的最后一篇. 一.声明文件简介 TypeScript作为JavaScript的超集,在开发过程中不可避免 ...

  2. TVS 选型

    TVS 选型 主要用于 IO 保护 TVS 的电压不要小于正常工作的电压,不然会影响正常工作. ESD 的电压很高,但是时间很短. TVS 有节电容,用于高速线路时要注意. 有双向的,也有单向的,还有 ...

  3. Hive之 数据类型

    hive 目前支持的数据类型如下: -- 数值类型 Numeric TypesTINYINT (1-byte signed integer, from -128 to 127)SMALLINT (2- ...

  4. centos 6.5 单实例搭建 ELK

    2018-07-02     21:32:33 ELK 单实例搭建 环境搭建 1.1我的系统版本 Distributor ID: CentOS Description:     CentOS rele ...

  5. oracle 归档日志总结

    Oracle 归档模式和非归档模式 归档模式和非归档模式 在DBA部署数据库之初,必须要做出的最重要决定之一就是选择归档模式(ARCHIVELOG)或者非 归档模式(NOARCHIVELOG )下运行 ...

  6. 远程连接Linux虚拟机上的mysql失败的解决方法

    今天在虚拟机Ubuntu上折腾了一晚上mysql,然后试着用java连接,搞了很久都没成功,但是同学配好的Debian上却连接成功了,也就是说我的配置有问题. 折腾了很久,最后还是通过理解异常信息来大 ...

  7. 【转】深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  8. Python链表与反链表

    # -*- coding:utf8 -*- #/usr/bin/env python class Node(object): def __init__(self, data, pnext = None ...

  9. LAMP的安装和注意事项

    LAMP--Linux+Apache(httpd)+MySQL+PHP,是常用的web服务器架构,下面接受编译安装的过程,以及出现的错误. 注意事项: 1. 扩展epel源:参照:http://www ...

  10. Oracle11g 搭建单实例DataGuard (转载)

    原文:http://blog.itpub.net/29324876/viewspace-1246133/ 环境:主备库都为单实例并且数据库SID相同 OS:red hat 6.5 Oracle:11. ...