zoukankan      html  css  js  c++  java
  • stl源码分析de练习

    // 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;
    }
    

      

  • 相关阅读:
    计算机中的那些缩写词
    Linux 下dns的搭建
    html中的定位
    编程基础之流程控制
    linux中kvm的安装及快照管理
    zabbix 中监控windows 的typepref中的值
    详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
    rhel7 单用户修改root密码
    Linux vim编辑器使用详解
    Linux下用ftp更新web内容!
  • 原文地址:https://www.cnblogs.com/itdef/p/6369802.html
Copyright © 2011-2022 走看看